DDL 触发器像标准触发器一样,在响应事件时执行存储过程。但与标准触发器不同的是,它们并不在响应对表或视图的 UPDATE、INSERT 或 DELETE 语句时执行存储过程。它们主要在响应数据定义语言 (DDL) 语句执行存储过程。这些语句包括 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 和 UPDATE STATISTICS 等语句。
若要获取数据库中的DDL触发器示例,请打开SQL Server Management Studio对象资源管理器中的“数据库触发器”文件夹(位于数据库的“可编程性”文件夹中)。右键单击 触发器 并选择“编写数据库触发器脚本为”。默认情况下禁用 DDL 触发器 触发器脚本。
数据库->可编程性->数据库触发器应用1:以下示例说明了如何使用DDL触发器来防止数据库中的任一表、存储过程被创建、修改或删除
create trigger safety
on database
for create_table,drop_table,
alter_table,create_procedure,
alter_procedure,drop_procedure
as
print 'you must disable trigger "safety" to drop or alter tables!'
rollback
go
--测试(建表)
create table test(a int)
--消息
you must disable trigger "safety" to drop or alter tables!
消息 3609,级别 16,状态 2,第 1 行
事务在触发器中结束。批处理已中止。--启用触发器:
Enable trigger safety on database;
--禁用触发器:
Disable trigger safety on database;
应用2:这个示例是将用户对数据库结构改变记录起来,以便查询。
create trigger audit on database for ddl_database_level_events
as
declare @data xml
declare @cmd nvarchar(1000)
declare @posttime nvarchar(24)
declare @spid nvarchar(6)
declare @loginname nvarchar(100)
declare @hostname nvarchar(100)
set @data=eventdata()
set @cmd=@data.value('(/event_instance/tsqlcommand/commandtext)[1]','nvarchar(1000)')
set @cmd=ltrim(rtrim(replace(@cmd,'','')))
set @posttime=@data.value('(/event_instance/posttime)[1]','nvarchar(24)')
set @spid=@data.value('(/event_instance/spid)[1]','nvarchar(6)')
set @loginname=@data.value('(/event_instance/loginname)[1]','nvarchar(100)')
set @hostname=host_name()
insert into dbo.auditlog(command,posttime,hostname,loginname) values (@cmd,@posttime,@hostname,@loginname)
go
词视糜诓煌攴莸某绦虼搿?/p>
在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份?