加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer DDL 触发器

发布时间:2020-12-12 12:49:58 所属栏目:MsSql教程 来源:网络整理
导读:DDL 触发器 主要作用 : 要防止对数据库架构进行某些更改 。 希望数据库中发生某种情况以响应数据库架构中的更改 。 要记录数据库架构中的更改或事件 。 仅在运行触发 DDL 触发器的 DDL 语句后 , DDL 触发器才会激发 。 DDL 触发器无法作为 INSTEAD OF 触发

DDL 触发器主要作用:

要防止对数据库架构进行某些更改

希望数据库中发生某种情况以响应数据库架构中的更改

要记录数据库架构中的更改或事件


仅在运行触发 DDL 触发器的 DDL 语句后DDL触发器才会激发DDL触发器无法作为 INSTEAD OF 触发器使用。


测试1:

--	数据库级别的触发器(只对当前数据库有用)
CREATE TRIGGER TR_DDL_Table
ON DATABASE 
FOR CREATE_TABLE,DROP_TABLE,ALTER_TABLE
--或者DDL_TABLE_EVENTS
AS 
BEGIN
   PRINT '触发器TR_DDL_TableSafety 已禁止对表进行DDL操作!' 
   ROLLBACK
END

--激活和禁用触发器
ENABLE TRIGGER TR_DDL_Table ON DATABASE;
DISABLE TRIGGER TR_DDL_Table ON DATABASE;

--删除触发器
DROP TRIGGER TR_DDL_Table ON DATABASE 

--	drop table test
create 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
    ROLLBACK
GO



--	创建数据库
--	drop database test
CREATE DATABASE [test] 
ON  PRIMARY ( 
NAME = N'test',FILENAME = N'D:test.mdf',SIZE = 3072KB,MAXSIZE = UNLIMITED,FILEGROWTH = 1024KB 
)
--进行了回滚操作并输出信息




测试3:

--	不回滚,但记录操作信息
--	DROP TABLE TABLE_SERVER_LEVEL_EVENTS
CREATE 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 CommandText
GO


CREATE 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 SERVER
GO


--查看 数据库级别 的触发器及事件
select a.name,a.parent_class_desc,b.type_desc
from sys.triggers a inner join sys.trigger_events b
on a.object_id=b.object_id

--查看 服务器级别 的触发器及事件
select a.name,b.type_desc
from sys.server_triggers a inner join sys.server_trigger_events b
on a.object_id=b.object_id



更多参考:

DDL 触发器

DDL 事件

DDL 事件组

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读