SQL Server 触发器文档格式.docx
《SQL Server 触发器文档格式.docx》由会员分享,可在线阅读,更多相关《SQL Server 触发器文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![SQL Server 触发器文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/11/0e1cc315-3d3c-441f-9700-419140b9c843/0e1cc315-3d3c-441f-9700-419140b9c8431.gif)
SQLServer中。
没有BEFOREINSERT或者AFTERINSERT
根据文档显示,以及代码的测试。
基本上类似于
Oracle的AFTERINSERT
SQLSercer触发器没有FOREACHROW关键字
一次更新一条,还是多条,取决于
INSERTED里面的内容。
CREATETRIGGERBeforeInsertTest
ON
test_trigger_table
FORINSERT
AS
DECLARE
@IdINT,
7&
@NameVARCHAR(10);
8&
BEGIN
9&
PRINT('
BEFORE
INSERT'
);
10&
SELECT@Id=id,@Name=nameFROMINSERTED;
11&
PRINT('
NewName='
+@Name);
12&
UPDATEtest_trigger_tableSETval=
100WHEREid=@Id;
13&
END;
14&
go
INSERTINTOtest_trigger_table(id,name)VALUES(1,
'
ABC'
BEFOREINSERT
NewName=ABC
(1行受影响)
select*fromtest_trigger_table;
idnameval
---------------------
-----------
1ABC100
UPDATE
TRIGGERAfterUpdateTest
ONtest_trigger_table
FOR
@OldNameVARCHAR(10),
@NewNameVARCHAR(10);
AFTER
UPDATE'
SELECT@NewName=nameFROMinserted;
SELECT
@OldName=nameFROMdeleted;
OldName='
+
@OldName);
+@NewName);
15&
UPDATEtest_trigger_tableSETname='
XYZ'
WHEREid=
1;
AFTERUPDATE
OldName=ABC
NewName=XYZDELETE
CREATETRIGGERAfterDeleteTest
DELETE
@OldNameVARCHAR(10);
BEGIN
AFTERDELETE'
SELECT@OldName=nameFROM
deleted;
+@OldName);
DELETEFROMtest_trigger_tableWHEREid=1;
OldName=XYZINSERT/UPDATE/DELETE行为判断
测试此处时,先删除前面的3个触发器
CREATETRIGGERAfterAllTest
INSERT,UPDATE,DELETE
ALL'
IFEXISTS(SELECT1FROMinserted)ANDNOTEXISTS(SELECT1FROM
deleted)
INSERTING'
END;
IFEXISTS(SELECT1FROMinserted)ANDEXISTS(SELECT1FROM
UPDATING'
IFNOTEXISTS(SELECT1FROMinserted)ANDEXISTS(SELECT1FROM
16&
17&
DELETING'
18&
19&
20&
INSERTINTOtest_trigger_table(id,
name)VALUES(1,'
WHEREid=1;
AFTERALL
INSERTING
UPDATING
DELETING
SQLServer
INSERT/UPDATE/DELETE多行
CREATETRIGGER
AfterAllTest2
@InsertCount
INT,
@DeleteCountINT;
2'
SELECT@InsertCount=COUNT
(1)FROMinserted;
SELECT@DeleteCount=COUNT
(2)FROMdeleted;
@InsertCount='
+STR(@InsertCount));
@DeleteCount='
+STR(@DeleteCount));
INSERTINTOtest_trigger_table(id,name)VALUES(1,'
AFTERALL2
@InsertCount=1
@DeleteCount=0
INSERTINTO
test_trigger_table(id,name)VALUES(2,'
DEF'
ALL
insertintotest_trigger_table
select*fromtest_trigger_table;
ALL2
@InsertCount=2
(2行受影响)
UPDATEtest_trigger_tableSET
name='
WHEREid=1;
2
@DeleteCount=2
针对特定列的触发
测试此处时,先删除其它的触发器
通过
COLUMNS_UPDATED
来判断哪些列被更新
函数以从左到右的顺序返回位,最左边的为最不重要的位。
最左边的位表示表中的第一列;
向右的下一位表示第二列,依此类推。
如果在表上创建的触发器包含8
列以上,则COLUMNS_UPDATED返回多个字节,最左边的为最不重要的字节。
在INSERT操作中COLUMNS_UPDATED
将对所有列返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。
dropTRIGGERAfterUpdateTest;
AfterUpdateTest
FORINSERT,
@OldValVARCHAR(10),
@NewValVARCHAR(10);
IF(COLUMNS_UPDATED()
&
amp;
4)&
0
AFTERUPDATEOnly
Val'
SELECT@NewVal=valFROMinserted;
@OldVal=valFROMdeleted;
OldVal='
@OldVal);
NewVal='
+@NewVal);
END
name,val)VALUES(1,'
1);
AFTERUPDATEOnlyVal
NewVal=1
WHEREid=1;