日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

SQL触发器

發布時間:2024/6/21 综合教程 40 生活家
生活随笔 收集整理的這篇文章主要介紹了 SQL触发器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、觸發器是一種特殊的存儲過程,它不能被顯式地調用,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。所以觸發器可以用來實現對表實施復雜的完整性約束。

二、SQL Server為每個觸發器都創建了兩個專用表:Inserted表和Deleted表。

這兩個表由系統來維護,它們存在于內存中而不是在數據庫中。這兩個表的結構總是與被該觸發器作用的表的結構相同。觸發器執行 完成后,與該觸發器相關的這兩個表也被刪除。

  Deleted表存放由于執行Delete或Update語句,而要從表中刪除的所有行。

  Inserted表存放由于執行Insert或Update語句,而要向表中插入的所有行。

三、Instead of 和 After觸發器

  SQL Server2000提供了兩種觸發器:Instead of 和After 觸發器。這兩種觸發器的差別在于他們被激活的時間。

  Instead of觸發器用于替代引起觸發器執行的T-SQL語句。除表之外,Instead of 觸發器也可以用于視圖,用來擴展視圖可以支持的更新操作。

  After觸發器在一個Insert,Update或Deleted語句之后執行,進行約束檢查等動作都在After觸發器被激活之前發生。After觸發器只能用于表。

  一個表或視圖的每一個修改動作(insert,update和delete)都可以有一個instead of 觸發器,一個表的每個修改動作都可以有多個After觸發器。

四、觸發器的執行過程

  如果一個Insert﹑update或者delete語句違反了約束,那幺After觸發器不會執行,因為對約束的檢查是在After觸發器被激動之前發生的。所以After觸發器不能超越約束。

  Instead of 觸發器可以取代激發它的操作來執行。它在Inserted表和Deleted表剛剛建立,其它任何操作還沒有發生時被執行。因為Instead of 觸發器在約束之前執行,所以它可以對約束進行一些預處理。

五、使用T-SQL語句來創建觸發器

  基本語句如下:

  create trigger trigger_name

  on {table_name | view_name}

  {for | After | Instead of }

  [ insert, update,delete ]

  as

  sql_statement

六、刪除觸發器

  基本語句如下:

  drop trigger trigger_name

七、查看數據庫中已有觸發器

  -- 查看數據庫已有觸發器

  use TestDB

  go

  select * from sysobjects where xtype='TR'

  -- 查看單個觸發器

  exec sp_helptext '觸發器名'

八、修改觸發器

  基本語句如下:

  alter trigger trigger_name

  on {table_name | view_name}

  {for | After | Instead of }

  [ insert, update,delete ]

  as

  sql_statement

九、相關示例

  打開sqlserver,在右側"對象資源管理器”找到需要操作的數據庫,點開數據庫找到需要創建’觸發器‘的表,點擊表名左側的加號,會出現如下所示

  

  右鍵點擊’觸發器‘,選擇’新建觸發器‘

  

如上圖所示,1后面寫上觸發器名稱,2寫上所操作的表名,3,處寫上當對表有“何種操作(insert,delete,update)時觸發

begin 后開始寫觸發后執行何種操作。

觸發器是利用了表數據發生變化時,自動生成的兩個虛擬表,一個是inserted,一個是deleted,這兩個虛擬表從其他地方是檢索不到的,只有觸發器能讀到。

當數據發生變化時,如果是新插入數據,則該數據會在inserted里面暫時保存。而刪除一條數據時,則會在deleted里面暫時保存。更新則等于先刪除再插入,也就是deleted里面存更新前,inserted里面存更新后。這些數據會在觸發器執行完成后消失。

這樣我們需要的數據只要從inserted和deleted里面讀取到就可以了。實例如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATETRIGGER [dbo].update_T1_Test
ON dbo.T1
AFTER UPDATE
AS
BEGIN
declare @AA_temp varchar(50);--定義一個變量
if(UPDATE([AA])) --獲取到T1表字段AA是否是更新
begin
SET NOCOUNT ON;
select @AA_temp = [AA] from inserted; --inserted新插入的數據

if(@AA_temp = 'test_a1') --如果更新的值為test_a1則備份數據到另外的表T2
begin
insert into T2 (cc, dd) select AA, BB from deleted;
end
end
END
GO

總結

以上是生活随笔為你收集整理的SQL触发器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。