MS触发器学习

create trigger dd on Chat For Insert,Update as
if(Update(chat) and Update(cmaster))
begin
declare @c char(15)
set @c=(select chat from inserted)
print @c
raiserror('chat',16,10)
rollback tran
return
end

Update chat set chat='2',cmaster='1'
where cid='1'

Unnamed

从生成的错误消息来看,Procedure dd,表明触发器是存储过程,

触发器分两种类型,一个后触发,一个是替代触发,上面的触发就是后触发,即在DML语法发生之后,数据提交到资料库之前,触发器发生。

在触发器发生之后,数据提交之前,MS生成两个特殊的临时表inserted和deleted,inserted存储的是新增的行(Insert 的新行,Update的新行),deleted存储的是被删除的行(delete的行,Update的旧行)

Update(列名),Columns_Updated()可以跟踪列值的变化。

Update(列名)只能跟踪单个列,如果是多个列,用Update(列名) And OR Update(列名)组合,他只返回True or False,不管DML语句是否成功。

Columns_Updated()返回的是varbinary ,例如一个表列名为C1 C2 C3 C4 C5,更新其中的C2 C3 C4,则power(2,2-1) power(2,3-1),power(2,4-1),通过和Colunms_Updated()做与操作,power(2,2-1) + power(2,3-1)+power(2,4-1)=14,则如果更新了C2 C3 C4,则Colunms_Updated()&14 >0

power(底数,幂),这个是幂的函数

这个是针对修改前八个列的情况,如果修改超过了8列,则使用SubString函数测试Columns_Updated()返回的更正位

这个还不太懂 http://msdn.microsoft.com/zh-cn/library/ms186329.aspx

raiserror(‘msg’,16,10),16是错误信息严重级别,0~18是任何用户都可以定义的,而19~25则要sysadmin权限或者alter trace权限的用户才可以定义

ps:20 到 25 之间的严重级别被认为是致命的。如果遇到致命的严重级别,客户端连接将在收到消息后终止,并将错误记录到错误日志和应用程序日志。

10是状态,便于用户查找。

alter trigger /drop trigger trgger_name

触发器可以嵌套也可以递归,可以引用其他资料表的对象。

原文地址:https://www.cnblogs.com/zqstc/p/1695354.html