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
總結
- 上一篇: WLK防骑拉怪手法(要有序排列再给我答案
- 下一篇: 如何导出元器件清单