
DDL 触发器主要作用:
要防止对数据库架构进行某些更改。
希望数据库中发生某种情况以响应数据库架构中的更改。
要记录数据库架构中的更改或事件。
仅在运行触发 DDL 触发器的 DDL 语句后,DDL触发器才会激发。DDL触发器无法作为 INSTEAD OF 触发器使用。
测试1:
-- 数据库级别的触发器(只对当前数据库有用)CREATE TRIGGER TR_DDL_tableON DATABASE FOR CREATE_table,DROP_table,ALTER_table--或者DDL_table_EVENTSAS BEGIN PRINT '触发器TR_DDL_tableSafety 已禁止对表进行DDL *** 作!' RolLBACKEND--激活和禁用触发器ENABLE TRIGGER TR_DDL_table ON DATABASE;disABLE TRIGGER TR_DDL_table ON DATABASE;--删除触发器DROP TRIGGER TR_DDL_table ON DATABASE -- drop table testcreate table test(ID int)
触发器TR_DDL_tableSafety 已禁止对表进行DDL *** 作!
消息3609,级别16,状态2,第1行
事务在触发器中结束。批处理已中止。
测试2:
-- 服务器级别的触发器CREATE TRIGGER TR_DDL_Database ON ALL SERVER FOR DDL_SERVER_LEVEL_EVENTS AS DECLARE @EVENTDATA XML; SET @EVENTDATA = EVENTDATA(); PRINT '触发器TR_DDL_Database 已禁止对数据库进行DDL *** 作!' SELECT @EVENTDATA.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)') AS EventType,@EVENTDATA.value('(/EVENT_INSTANCE/PostTime)[1]','nvarchar(max)') AS PostTime,@EVENTDATA.value('(/EVENT_INSTANCE/Servername)[1]','nvarchar(max)') AS Servername,@EVENTDATA.value('(/EVENT_INSTANCE/Databasename)[1]','nvarchar(max)') AS Databasename,@EVENTDATA.value('(/EVENT_INSTANCE/TsqlCommand/CommandText)[1]','nvarchar(max)') AS CommandText RolLBACKGO -- 创建数据库-- drop database testCREATE DATABASE [test] ON PRIMARY ( name = N'test',filename = N'D:\test.mdf',SIZE = 3072KB,MAXSIZE = UNliMITED,fileGROWTH = 1024KB )--进行了回滚 *** 作并输出信息
测试3:
-- 不回滚,但记录 *** 作信息-- DROP table table_SERVER_LEVEL_EVENTSCREATE table MASTER.DBO.table_SERVER_LEVEL_EVENTS(EventType NVARCHAR(100),PostTime DATETIME,Servername NVARCHAR(100),Databasename NVARCHAR(100),CommandText NVARCHAR(MAX),)-- 服务器级别的触发器CREATE TRIGGER TR_DDL_Database ON ALL SERVER FOR DDL_SERVER_LEVEL_EVENTS AS DECLARE @EVENTDATA XML; SET @EVENTDATA = EVENTDATA(); INSERT INTO MASTER.DBO.table_SERVER_LEVEL_EVENTS(EventType,PostTime,Servername,Databasename,CommandText) SELECT @EVENTDATA.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)') AS CommandTextGOCREATE DATABASE [test] ON PRIMARY ( name = N'test',fileGROWTH = 1024KB )DROP DATABASE [test]SELECT * FROM MASTER.DBO.table_SERVER_LEVEL_EVENTS --删除触发器DROP TRIGGER TR_DDL_Database ON ALL SERVERGO
--查看 数据库级别 的触发器及事件select a.name,a.parent_class_desc,b.type_descfrom sys.triggers a inner join sys.trigger_events bon a.object_ID=b.object_ID--查看 服务器级别 的触发器及事件select a.name,b.type_descfrom sys.server_triggers a inner join sys.server_trigger_events bon a.object_ID=b.object_ID
更多参考:
DDL 触发器
DDL 事件
DDL 事件组
总结以上是内存溢出为你收集整理的SqlServer DDL 触发器全部内容,希望文章能够帮你解决SqlServer DDL 触发器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)