SQL Server误区30日谈 第4天 DDL触发器就是INSTEAD OF触发器
误区 #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)”。
相关文章
SQL事务用法begin tran,commit tran和rollback tran的用法
Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务。begin tran表示开始事务, commit tran表示提交事务,rollback tran表示回滚事物2011-12-12使用FORFILES命令来删除SQLServer备份的批处理
利用这些参数可以构造下面的例子来解决你删除备份脚本文件的难题。你可以基于更改时间/日期或者备份类型来创建脚本。你甚至可以构造能够同时参照两种标准的脚本2012-05-05SQL Server跨服务器操作数据库的图文方法(LinkedServer)
这篇文章主要介绍了SQL Server跨服务器操作数据库的方法,通过链接服务器(LinkedServer)实现SQL Server远程链接MySql等数据库,需要的朋友可以参考下2022-10-10SQL SERVER 2012新增函数之逻辑函数CHOOSE详解
这篇文章主要介绍了SQL SERVER 2012新增函数之逻辑函数CHOOSE的相关资料,文中介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。2017-03-03SQL Server开发智能提示插件SQL Prompt介绍
这篇文章介绍了SQL Server开发智能提示插件SQL Prompt,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-05-05sqlserver 日志恢复方法(搞定drop和truncate)
这是一次数据恢复中,我们老大在Sql中敲的,我这里最想记录的是他优良的代码风格.2009-10-10
最新评论