在MSSQL中,DDL触发器一般用来做危险操作的拦截或者审计日志记录用。
查询数据库级别的DDL触发器
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触发器
SELECT
name AS TriggerName,
is_disabled
FROM
sys.server_triggers
WHERE
type = 'TR' -- 表示DDL触发器
ORDER BY
name;
1 检测到drop table和alter table的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 触发器将输出消息
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的触发器
-- 注意:它不会记录#或##这类的临时表相关的任何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 删除。