- ---觸發器 一種特殊的存儲過程,觸發器主要是經過事件進行觸發被自動調用執行的。而存儲過程能夠經過存儲過程的名稱被調用
- --觸發器是當對某一個表進行操做。諸如:update、insert、delete這些操做的時候,系統會自動調用執行該表上對應的觸發器
- --SQL Server 2005中觸發器能夠分爲兩類:DML觸發器和DDL觸發器,其中DDL觸發器它們會影響多種數據定義語言語句而激發,這些語句有create、alter、drop語句。
- --DML 觸發器分爲
- --一、 after觸發器(以後觸發)
- -- a、 insert觸發器
- -- b、 update觸發器
- -- c、 delete觸發器
- --PS:其中after觸發器要求只有執行某一操做insert、update、delete以後觸發器才被觸發,且只能定義在表上
- -- 二、 instead of 觸發器 (以前觸發)
- --PS:而instead of觸發器表示並不執行其定義的操做(insert、update、delete)而僅是執行觸發器自己。既能夠在表上定義instead of觸發器,也能夠在視圖上定義
- --觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。
- --有系統在內存中建立者兩張表,不會存儲在數據庫中。並且兩張表的都是隻讀的,只能讀取數據而不能修改數據。
- --這兩張表的結果老是與被改觸發器應用的表的結構相同。當觸發器完成工做後,這兩張表就會被刪除。
- --Inserted表的數據是插入或是修改後的數據,而deleted表的數據是更新前的或是刪除的數據。
- --create trigger trg_name
- --on table_name
- --with encryption --加密觸發器
- -- for update......
- --as
- -- Transact-SQL
- ---建立Insert插入類型觸發器
- if(OBJECT_ID ('trg_insert','tr')is not null)
- drop trigger trg_insert
- go
- create trigger trg_insert
- on student2
- for insert --插入觸發 (向student2插入記錄,會插入相同的name 到student 表中)
- as
- --定義變量
- declare @id int,@name varchar(20),@sex int;
- select @idid=id,@namename=name from inserted;--從inserted 表中取出插入的記錄
- set @name=@name+CONVERT(varchar,@id);
- insert into student values(@name,1,'ddd',GETDATE (),GETDATE (),GETDATE ());
- print 'student添加學生成功'
- go
- --測試
- insert into student2 values('insertName',1,'insertClass')
- select * from student2
- select * from student
- ---- 建立刪除類型觸發器
- if(OBJECT_ID ('tgr_delete','tr')is not null)
- drop trigger tgr_delete
- go
- create trigger [dbo].[tgr_delete]
- on [dbo].[student2]
- for delete --將刪除student2的記錄,存入到另張表中
- as
- print '備份數據中'
- if(object_id('student2BackUp','U')is not null )
- insert into student2BackUp select name,sex ,class from deleted --從deleted表中取出刪除的表
- else
- select * into student2BackUp from deleted
- print '備份數據成功'
- go
- --測試
- delete student2 where id=3
- select * from student2
- select * from student2BackUp
- --建立update類型的觸發器
- if(OBJECT_ID ('tgr_update','tr')is not null)
- drop trigger tgr_update
- go
- create trigger [dbo].[tgr_update]
- on [dbo].[student2] ---將student2中更新的記錄級聯更新到student表中(若student表中存在對應的記錄)
- for update
- as
- declare @oldName varchar(20),@newName varchar(20)
- --更新前的數據
- select @oldName =name from deleted--從deleted表中取刪除的老名字
- print @oldName
- if(exists(select * from student where name like '%'+@oldName+'%'))
- begin
- select @newName=name from inserted --從inserted表中取出更新後的新名字
- update student set name=REPLACE (name,@oldName ,@newName )
- where name like '%'+@oldName +'%'
- print '級聯修改數據成功'
- end
- else
- print '無需修改student表'
- GO
- --測試
- update student2 set name='updateName' where id=4
- select * from student2
- select * from student
- ---建立instead of 觸發器
- if(OBJECT_ID ('tgr_insteadOf','tr')is not null)
- drop trigger tgr_insteadOf
- go
- create trigger [dbo].[tgr_insteadOf]
- on [dbo].[student2]
- instead of delete --update ,insert
- as
- declare @name varchar(20)
- select @namename=name from deleted
- delete student where name=@name
- print 'name'+@name+'刪除成功!'
- go
- --測試
- select * from student2
- select * from student
- delete student2 where id=19
- select * from student2
- select * from student --其實只刪除了student表中的記錄
- --建立updatecolumn類型觸發器
- if(OBJECT_ID ('tgr_update_column','tr')is not null)
- drop trigger tgr_update_column
- go
- create trigger [dbo].[tgr_update_column]
- on [dbo].[student2]
- for update
- as
- if(update(sex))
- begin
- raisError('性別不能隨意設置',16,11)
- rollback tran
- end
- GO
- --測試
- update student2 set sex=1 where sex is null
- ---刪除觸發器
- drop trigger trigger_name
- --查看數據庫中已有觸發器
- select * from sysobjects where xtype='tr'
- --查看單個觸發器 (定義的文本)
- exec sp_helptext 'trg_insert' --‘觸發器名’
- --修改觸發器
- alter trigger trigger_name
- on {table_name | view_name}
- {for | After | Instead of }
- [ insert, update,delete ]
- as
- sql_statement
PS: 一個表或視圖的每個修改動做(insert,update和delete)均可以有一個instead of 觸發器﹐一個表的每一個修改動做均可以有多個After觸發器。sql