一.本文所涉及的内容(Contents)
- 本文所涉及的内容(Contents)
- 背景(Contexts)
- 基础知识(Rudimentary Knowledge)
- DDL运用场景(DDL Scene)
- 补充说明(Addon)
- 疑问(Questions)
- 参考文献(References)
二.背景(Contexts)
说到触发器,大家都会想到这样的使用场景:当一个表的数据修改了,运用DML触发插入或者更新到其它表中;那DDL触发器(SQL Server 2005引入的新功能)会运用到什么场景中呢?本文将为你讲述4种运用DDL触发器的场景:
1) 禁止用户修改和删除表;
2) 禁止用户删除数据库;
3) 记录和监控某数据库所有的DDL操作;
4) 把DDL操作信息以邮件的形式主动发送通知和预警;
三.基础知识(Rudimentary Knowledge)
DDL触发器是由修改数据库对象的 DDL 语句(如以 CREATE、ALTER 或 DROP)激发。
DDL触发器支持BEFORE和AFTER事件触发器,并在数据库或模式级运行。通常,DDL触发器用于监控数据库中的重要事件。有时用它们来监控错误代码。错误代码可能会执行破坏数据库或使数据库不稳定的活动。更常见的情况是:在开发、测试和stage系统中用它们来了解和监控数据库活动的动态。
当监控GRANT和REVOKE权限语句时,它们也是有效的安全工具。
四.DDL运用场景(DDL Scene)
(一) 首先我们来看一个简单的例子:创建数据库DDL_DB和一个名为DatabaseLog的表,现在创建一个DDL触发器:禁止用户修改和删除表,并进行提醒。执行下面的SQL脚本进行测试。
--Script1: --创建测试数据库 USE MASTER GO CREATE DATABASE DDL_DB --创建DDL触发器记录表 USE DDL_DB GO CREATE TABLE [dbo].[DatabaseLog]( [DatabaseLogID] [int] IDENTITY(1,1) NOT NULL, [PostTime] [datetime] NOT NULL, [ServerName] [sysname] NOT NULL, [LoginName] [sysname] NOT NULL, [DatabaseUser] [sysname] NOT NULL, [DatabaseName] [sysname] NOT NULL, [Schema] [sysname] NULL, [Object] [sysname] NULL, [TSQL] [nvarchar](max) NOT NULL, [Event] [sysname] NOT NULL, [XmlEvent] [xml] NOT NULL, CONSTRAINT [PK_DatabaseLog_DatabaseLogID] PRIMARY KEY NONCLUSTERED ( [DatabaseLogID] ASC ) ON [PRIMARY] ) ON [PRIMARY] --Script2: --创建DDL触发器:禁止修改或者删除数据表 CREATE TRIGGER DDL_TableTrigger ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS PRINT '