SQL Server 触发器.docx
- 文档编号:669633
- 上传时间:2022-10-12
- 格式:DOCX
- 页数:14
- 大小:16.86KB
SQL Server 触发器.docx
《SQL Server 触发器.docx》由会员分享,可在线阅读,更多相关《SQL Server 触发器.docx(14页珍藏版)》请在冰豆网上搜索。
SQLServer触发器
SQLServer触发器
测试表
1>CREATE
TABLEtest_trigger_table(
2>idINT,
3>name
VARCHAR(10),
4>valINT
5>);
6>go
INSERT
注:
SQLServer中。
没有BEFOREINSERT或者AFTERINSERT
根据文档显示,以及代码的测试。
基本上类似于
Oracle的AFTERINSERT
SQLSercer触发器没有FOREACHROW关键字
一次更新一条,还是多条,取决于
INSERTED里面的内容。
1>CREATETRIGGERBeforeInsertTest
2>ON
test_trigger_table
3>FORINSERT
4>AS
5>DECLARE
6>
@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
1>
2>INSERTINTOtest_trigger_table(id,name)VALUES(1,
'ABC');
3>go
BEFOREINSERT
NewName=ABC
(1行受影响)
1>select*fromtest_trigger_table;
2>
go
idnameval
---------------------
-----------
1ABC100
(1行受影响)
UPDATE
1>CREATE
TRIGGERAfterUpdateTest
2>ONtest_trigger_table
3>FOR
UPDATE
4>AS
5>DECLARE
6>@OldNameVARCHAR(10),
7>
@NewNameVARCHAR(10);
8>BEGIN
9>PRINT('AFTER
UPDATE');
10>SELECT@NewName=nameFROMinserted;
11>SELECT
@OldName=nameFROMdeleted;
12>PRINT('OldName='+
@OldName);
13>PRINT('NewName='+@NewName);
14>END;
15>
go
1>
2>UPDATEtest_trigger_tableSETname='XYZ'WHEREid=
1;
3>go
AFTERUPDATE
OldName=ABC
(1行受影响)
NewName=XYZDELETE
1>
CREATETRIGGERAfterDeleteTest
2>ONtest_trigger_table
3>FOR
DELETE
4>AS
5>DECLARE
6>@OldNameVARCHAR(10);
7>
BEGIN
8>PRINT('AFTERDELETE');
9>SELECT@OldName=nameFROM
deleted;
10>PRINT('OldName='+@OldName);
11>END;
12>
go
1>DELETEFROMtest_trigger_tableWHEREid=1;
2>go
AFTER
DELETE
(1行受影响)
OldName=XYZINSERT/UPDATE/DELETE行为判断
测试此处时,先删除前面的3个触发器
1>
CREATETRIGGERAfterAllTest
2>ONtest_trigger_table
3>FOR
INSERT,UPDATE,DELETE
4>AS
5>BEGIN
6>PRINT('AFTER
ALL');
7>IFEXISTS(SELECT1FROMinserted)ANDNOTEXISTS(SELECT1FROM
deleted)
8>BEGIN
9>PRINT('INSERTING');
10>
END;
11>IFEXISTS(SELECT1FROMinserted)ANDEXISTS(SELECT1FROM
deleted)
12>BEGIN
13>PRINT('UPDATING');
14>
END;
15>IFNOTEXISTS(SELECT1FROMinserted)ANDEXISTS(SELECT1FROM
deleted)
16>BEGIN
17>PRINT('DELETING');
18>
END;
19>END;
20>go
1>INSERTINTOtest_trigger_table(id,
name)VALUES(1,'ABC');
2>UPDATEtest_trigger_tableSETname='XYZ'
WHEREid=1;
3>DELETEFROMtest_trigger_tableWHEREid=1;
4>
go
AFTERALL
INSERTING
(1行受影响)
AFTERALL
UPDATING
AFTERALL
DELETING
1>SQLServer
INSERT/UPDATE/DELETE多行
1>CREATETRIGGER
AfterAllTest2
2>ONtest_trigger_table
3>FOR
INSERT,UPDATE,DELETE
4>AS
5>DECLARE
6>@InsertCount
INT,
7>@DeleteCountINT;
8>BEGIN
9>PRINT('AFTERALL
2');
10>SELECT@InsertCount=COUNT
(1)FROMinserted;
11>
SELECT@DeleteCount=COUNT
(2)FROMdeleted;
12>
PRINT('@InsertCount='+STR(@InsertCount));
13>
PRINT('@DeleteCount='+STR(@DeleteCount));
14>END;
15>
go
1>INSERTINTOtest_trigger_table(id,name)VALUES(1,'ABC');
2>
go
AFTERALL
INSERTING
AFTERALL2
@InsertCount=1
(1行受影响)
@DeleteCount=0
1>INSERTINTO
test_trigger_table(id,name)VALUES(2,'DEF');
2>go
AFTER
ALL
INSERTING
AFTERALL2
@InsertCount=1
(1行受影响)
@DeleteCount=0
1>insertintotest_trigger_table
select*fromtest_trigger_table;
2>go
AFTERALL
INSERTING
AFTER
ALL2
@InsertCount=2
(2行受影响)
@DeleteCount=0
1>UPDATEtest_trigger_tableSET
name='XYZ'WHEREid=1;
2>go
AFTERALL
UPDATING
AFTERALL
2
@InsertCount=2
(2行受影响)
@DeleteCount=2
1>针对特定列的触发
测试此处时,先删除其它的触发器
SQLServer
通过
COLUMNS_UPDATED
来判断哪些列被更新
COLUMNS_UPDATED
函数以从左到右的顺序返回位,最左边的为最不重要的位。
最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。
如果在表上创建的触发器包含8
列以上,则COLUMNS_UPDATED返回多个字节,最左边的为最不重要的字节。
在INSERT操作中COLUMNS_UPDATED
将对所有列返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。
1>dropTRIGGERAfterUpdateTest;
2>go
1>CREATETRIGGER
AfterUpdateTest
2>ONtest_trigger_table
3>FORINSERT,
UPDATE
4>AS
5>DECLARE
6>@OldValVARCHAR(10),
7>
@NewValVARCHAR(10);
8>BEGIN
9>
10>IF(COLUMNS_UPDATED()
&4)>0
11>BEGIN
12>PRINT('AFTERUPDATEOnly
Val');
13>SELECT@NewVal=valFROMinserted;
14>SELECT
@OldVal=valFROMdeleted;
15>PRINT('OldVal='+
@OldVal);
16>PRINT('NewVal='+@NewVal);
17>
END;
18>END
19>go
1>INSERTINTOtest_trigger_table(id,
name,val)VALUES(1,'ABC',1);
2>go
AFTERUPDATEOnlyVal
(1行受影响)
NewVal=1
1>
2>UPDATEtest_trigger_tableSET
name='XYZ'WHEREid=1;
3&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL Server 触发器