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 Server 触发器 表的特定字段更新时,触发Update触发器
复制代码 代码如下: create trigger TR_MasterTable_Update on MasterTable after update as if update ([Type])--当Type字段被更新时,才会触发此触发器 insert into MasterLogTable select Id ,(Case [Type] when 1 then 'Type1' when 2 then 'Type2' when 3 then 'Type3' when 4 then 'Type4'
-
SQLServer触发器创建、删除、修改、查看示例代码
一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束. 二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表.这两个表. 一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二: SQL Server为每个触发器都创建了两个专用表:Inse
-
你真的了解触发器么 数据实时同步更新问题剖析
当我们想更新一张动态表的时候(即:表中的数据不断的添加),也许我们会用数据库代理,通过写作业,然后让他定时查询动态表中最新添加的数据,然后更新数据.这样时能实现更新数据的要求,但是数据却不能实时同步更新. 这个时候,触发器就是我们想要的神器了.我们可以在那张动态表上新建触发器.触发器的实质就是个存储过程,只不过他调用的时间是根据所建的动态表发生该表而执行(即:Insert新数据,Update或者Delete数据). 具体怎么使用触发器,今天我这里就不介绍了,园子里资料多的很.那么我今天要介绍的是
-
Sql Server触发器的使用
Sql Server为每个触发器都创建了两个专用表:Inserted表和Deleted表.这两个表由系统来维护,它们存在于内存中而不是数据库中.这两个表的结构总是与被该触发器作用的表的结构相同,触发器执行完成后,与该触发器相关的这两个表也被删除. 对表的操作 Inserted逻辑表 Deleted逻辑表 增加记录(insert) 存放增加的记录 无 删除记录(delete) 无 存放被删除的记录 修改记录(update) 存放更新后的记录 存放更新前的记录 三.for.after.instead
-
sqlserver 触发器学习(实现自动编号)
总结常用基本点如下: 1.触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器). DDL触发器:在用户对数据库执行数据定义(CREATE.ALTER.DROP或相似的语句)对数据库结构进行修改时激活而做出响应. DML触发器:在用户对数据库执行数据操作时发生,触发器中的代码会被自动调用. 2.DML触发器分类:Insert触发器.Delete触发器.Update触发器.上面任意类型混合. 3.触发器创建语法: 复制代码 代码如下: CREATE TRIGGER
-
sqlserver中触发器+游标操作实现
复制代码 代码如下: Create trigger tri_wk_CSVHead_History on wk_CSVHead_History --声明一个tri_wk_CSVHead_History触发器, instead of insert ---插入操作被代替执行下面的操作 as begin declare YB cursor --声明一个游标 for select NoteNO from inserted--这里的NoteNO要和下面的匹配 open YB declare @NoteNO
-
SQL Server触发器及触发器中的事务学习
如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,和触发器中事务个故事.在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器 & DDL触发器)和After触发器 & Instead Of 触发器的应用不同,开始说起它们,然后是说与事务有关的故事.如果,你有什么建议和意见,都可以通过文章后面的回复与我沟通,或者通过E-Mail方式,与 我交流:我的Email地址是:glal@163.co
-
SQLServer 触发器 数据库进行数据备份
复制代码 代码如下: create table test3(id int primary key not null identity(1,1),uname varchar(20),uage int); create table test3_bak(id int primary key not null identity(1,1),bid int,uname varchar(20), uage int,active char(1)); 第二步,编写备份用的触发器,只有更新或者是插入的时候才触发 复
-
sqlserver 触发器实例代码
定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: 复制代码 代码如下: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) Create Table BorrowRecord( --学生借书记录表
-
sqlserver 禁用触发器和启用触发器的语句
--禁用 复制代码 代码如下: alter table tb disable trigger tir_name --啟用 复制代码 代码如下: alter table tb enable trigger tir_name
-
sqlserver 触发器教程
主类别表名:Navtion_TopSubject 主键fTopID Char(36) 次类别表名:Navtion_NodeSubject 外键同上 内容表名:tText 外键同上 复制代码 代码如下: // ------------- 代码开始 -------------------- CREATE TRIGGER [RemoveTopAndNodeText] ON [dbo].[Navtion_TopSubject] INSTEAD OF DELETE AS /* 定义触发器使用的变量 */
随机推荐
- oracle数据库导入TXT文件方法介绍
- JS处理json日期格式化问题
- JavaScript实现DOM对象选择器
- .NET中函数Main的使用技巧
- header跳转和include包含问题详解
- android中强制更新app实例代码
- php GD绘制24小时柱状图
- JavaScript限定复选框的选择个数示例代码
- PowerShell中按修改时间查找文件的方法
- Oracle 查询死锁并解锁的终极处理方法
- Wampserver2.5配置虚拟主机出现403 Forbidden的处理方案
- easyui messager alert 三秒后自动关闭提示的实例
- 用js实现终止浏览器对页面HTML的继续解析即停止解析 兼容firefox
- iOS利用CoreImage实现人脸识别详解
- Android开发中数据库升级且表添加新列的方法
- Android实现输入法弹出时把布局顶上去和登录按钮顶上去的解决方法
- jQuery实现页码跳转式动态数据分页
- 利用python和百度地图API实现数据地图标注的方法
- DB为何大量出现select @@session.tx_read_only 详解
- 从源码里了解vue中的nextTick的使用