前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQLServer中的DDL触发器

SQLServer中的DDL触发器

原创
作者头像
保持热爱奔赴山海
修改2024-03-14 14:35:18
1620
修改2024-03-14 14:35:18
举报
文章被收录于专栏:饮水机管理员饮水机管理员

在MSSQL中,DDL触发器一般用来做危险操作的拦截或者审计日志记录用。

查询

查询数据库级别的DDL触发器

代码语言:sql
复制
use AdventureWorks2019;
SELECT 
    name AS TriggerName,
    parent_class_desc,
    is_disabled
FROM 
    sys.triggers
WHERE 
    parent_class = 0 -- 表示数据库层级的触发器
    AND type = 'TR' -- 表示DDL触发器
ORDER BY 
    name;

查询服务器级别的DDL触发器

代码语言:sql
复制
SELECT 
    name AS TriggerName,
    is_disabled
FROM 
    sys.server_triggers
WHERE 
    type = 'TR' -- 表示DDL触发器
ORDER BY 
    name;

创建

1 检测到drop table和alter table的sql,自动回滚并输入提示信息

代码语言:sql
复制
CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_TABLE, ALTER_TABLE   
AS   
   PRINT 'You must disable Trigger "safety" to drop or alter tables!'   
   ROLLBACK;

这样当发生执行drop table的时候,会如下提示

2 如果当前服务器实例上发生任何 CREATE_DATABASE 事件,DDL 触发器将输出消息

代码语言:sql
复制
IF EXISTS (SELECT * FROM sys.server_triggers  
    WHERE name = 'ddl_trig_database')  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  

CREATE TRIGGER ddl_trig_database   
ON ALL SERVER   
FOR CREATE_DATABASE   
AS   
    PRINT 'Database Created.'  
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  

DROP TRIGGER ddl_trig_database ON ALL SERVER;  

3、下面是一个针对AdventureWorks2019库下全部类型DDL的触发器

代码语言:sql
复制
-- 注意:它不会记录#或##这类的临时表相关的任何DDL语句

USE AdventureWorks2019;  
GO  

CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000));  
GO  

CREATE TRIGGER log   
ON DATABASE   
FOR DDL_DATABASE_LEVEL_EVENTS   
AS  
DECLARE @data XML  
SET @data = EVENTDATA()  
INSERT ddl_log   
   (PostTime, DB_User, Event, TSQL)   
   VALUES   
   (GETDATE(),   
   CONVERT(nvarchar(100), CURRENT_USER),   
   @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),   
   @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;  
GO  

--Test the trigger  
CREATE TABLE TestTable (a int)  
DROP TABLE TestTable ;  
GO  

SELECT * FROM ddl_log ;  
GO  

效果如下(前2条的db_user显示dbo的是sa账号执行的记录):

4、或者在MSSM中启用数据库自带的ddl级触发器

默认是禁用的,直接右击启用即可。(这个触发器的内容比我们上面的这个稍微详细点)

select * from [dbo].[DatabaseLog] order by PostTime desc ;

效果如下:

5、经测试,如果已经启用数据库级或服务器级触发器,则在创建内存表是不支持的,会有如下的报错:

Database and server triggers on DDL statements CREATE, ALTER and DROP are not supported with memory optimized tables.

参考:

https://learn.microsoft.com/zh-cn/sql/relational-databases/triggers/ddl-triggers?view=sql-server-ver16

https://learn.microsoft.com/zh-cn/sql/relational-databases/triggers/use-the-eventdata-function?view=sql-server-ver16

https://learn.microsoft.com/zh-cn/sql/relational-databases/triggers/ddl-event-groups?view=sql-server-ver16

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 查询
  • 创建
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档