SqlServer DDL 触发器

SqlServer DDL 触发器,第1张

概述DDL 触发器主要作用: 要防止对数据库架构进行某些更改。 希望数据库中发生某种情况以响应数据库架构中的更改。 要记录数据库架构中的更改或事件。 仅在运行触发 DDL 触发器的 DDL 语句后,DDL触发器才会激发。DDL触发器无法作为 INSTEAD OF 触发器使用。 测试1: -- 数据库级别的触发器(只对当前数据库有用)CREATE TRIGGER TR_DDL_TableON DAT

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 触发器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1161204.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存