欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL Server误区30日谈 第4天 DDL触发器就是INSTEAD OF触发器

程序员文章站 2024-02-09 17:42:16
误区 #4: ddl触发器(sql server 2005之后被引入)就是instead of触发器 这是错误的     ddl触发器...

误区 #4: ddl触发器(sql server 2005之后被引入)就是instead of触发器

这是错误的

    ddl触发器的实现原理其实就是一个after触发器。这个意思是先发生ddl操作,然后触发器再捕捉操作(当然如果你在触发器内写了rollback,则也可能回滚)。

    存在rollback也意味着这个触发器并不像你想象的那么轻量,来看下面的例子:

    alter table mybigtable add mynewnonnullcolumn varchar (20) default 'paul'

    如果存在一个defined for alter_table事件的ddl触发器,或是一个更宽泛的事件比如ddl_table_events。上面那个ddl代码将会对表中每一行数据加进新列,之后触发触发器操作。如果你的触发器中存在回滚来阻止ddl操作发生,那么这个代价可不小(不信的话你自己看看这么做后产生的日志)。

    当然更好的办法是对alter设置grant或是deny权限,或是仅仅允许通过你创建的存储过程进行ddl操作。

    但不管怎么样,虽然ddl触发器可以达到禁止ddl的操作的目的,但代价昂贵。而ddl触发器的好处是允许记录某些人做了某些修改表之类的操作,所以我并不是说不允许ddl触发器,而是要小心使用。

    kimberly有一篇非常好的关于ddl触发器的博文:"execute as" and an important update your ddl triggers (for auditing or prevention)”。