当前位置:数据库 > SQLServer >>

关于MSSQL中触发器的问题

我写了一个简单的测试触发器 CREATE TRIGGER TEST ON TABLE1 FOR AFTER DELETE AS BEGIN BEGIN TRANSACTION IF 1=1 ROLLBACK TRANSACTION END 当我执行 DELETE FROM TABLE1 以后我理解的应该是TABLE1中的数据被删除了,因为触发器中的AFTER子句决定了触发器是在执行触发SQL 也就是DELETE语句以后才执行的,所以这个回滚不是对DETELE做的; 但是实际执行的结果是TABLE1中的记录都没有删除,这是为什么? 请指点一二
补充:既然是后触发,也就是执行完DELETE 操作以后才启动触发器,而写在触发器中的回滚操作实际上不是对DELETE的回滚.
那与之对应的有没有前触发器?
答案:你理解都错了, FOR与 AFTER 属于后触发器 也就是执行完成后在执行触发器, 
DBMS会把你之前对表的操作与触发器执行的语句看成一个事务来执行,你建的触发器是个回滚的操作,当然会恢复你delete 的操作

---------------
当然有前触发器 ,instead of 的 就 属于 前触发器,具体怎么定义的建议你去找找相关资料,我这里一下也说不清楚!
其他:既然数据回滚了,当然就不会删除数据了。 delete语句是数据库操作语言(dml),这个操作会放到rollback segement中,也就是要进行事务处理,当事务提交后delete操作才会生效
你的这个删除触发器中,在删除的同时,会记录下被删除的数据并存放到触发器的deleted表中,由于你的表中有个回滚操作,于是乎,触发器就又把deleted表中的数据又恢复到你的原表中。
不知理解否? 

上一个:mssql 如何返回行数值
下一个:MSSQL转Sybase问题

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,