SQL Server数据库级别触发器
禁止修改表结构和加表
CREATE TRIGGER [Object_Change_Trigger_DDL] ON DATABASE FOR ALTER_TABLE,DROP_TABLE,CREATE_TABLE,CREATE_INDEX,ALTER_INDEX, DROP_INDEX AS DECLARE @EventData AS XML; SELECT @EventData = EVENTDATA(); IF @EventData.value('(/EVENT_INSTANCE/LoginName)[1]','varchar(150)') NOT IN ( 'uws_M_ApricotMDM_dev' ,'Us_wangdan_temp' ,'NT AUTHORITY\SYSTEM' ,'NT SERVICE\MSSQLSERVER' ,'WIN-6RNHUPNK4OJ\Administrator' ,'NT SERVICE\SQLSERVERAGENT' ,'bl_un' ) BEGIN --RAISERROR ('创建,修改,删除表的权限已收回,如有问题请联系DBA!', 16, 1) ROLLBACK END GO ENABLE TRIGGER [Object_Change_Trigger_DDL] ON DATABASE GO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | CREATE TABLE [dbo].[DDLMonitor]( [ID] [ INT ] IDENTITY(1,1) NOT NULL , [SPID] [ INT ] NULL , [ServerName] [ VARCHAR ](150) NULL , [PostTime] [DATETIME] NULL , [EventType] [ VARCHAR ](300) NULL , [LoginName] [ VARCHAR ](150) NULL , [UserName] [ VARCHAR ](100) NULL , [SchemaName] [ VARCHAR ](100) NULL , [DatabaseName] [ VARCHAR ](100) NULL , [ObjectName] [ VARCHAR ](100) NULL , [ObjectType] [ VARCHAR ](100) NULL , [TSQLCommand] [ VARCHAR ]( MAX ) NULL , [EventData] [XML] NULL , [createdate] [DATETIME] NULL DEFAULT (GETDATE()), CONSTRAINT [PK_DDLMonitor] PRIMARY KEY NONCLUSTERED ( [ID] ASC ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ] ) ON [ PRIMARY ] TEXTIMAGE_ON [ PRIMARY ] GO |
--记录加的表和字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | CREATE TRIGGER [trg_DDL_audit] ON DATABASE FOR ALTER_PROCEDURE,DROP_PROCEDURE,ALTER_FUNCTION,DROP_FUNCTION,ALTER_TABLE,DROP_TABLE,CREATE_TABLE AS DECLARE @EventData AS XML; SELECT @EventData = EVENTDATA(); INSERT INTO DDLMonitor.dbo.DDLMonitor( SPID, ServerName, PostTime, EventType, LoginName, UserName, SchemaName, DatabaseName, ObjectName, ObjectType, TSQLCommand, [EventData] ) VALUES ( @EventData.value( '(/EVENT_INSTANCE/SPID)[1]' , 'int' ), @EventData.value( '(/EVENT_INSTANCE/ServerName)[1]' , 'varchar(50)' ), @EventData.value( '(/EVENT_INSTANCE/PostTime)[1]' , 'datetime' ), @EventData.value( '(/EVENT_INSTANCE/EventType)[1]' , 'varchar(100)' ), @EventData.value( '(/EVENT_INSTANCE/LoginName)[1]' , 'varchar(150)' ), @EventData.value( '(/EVENT_INSTANCE/UserName)[1]' , 'varchar(100)' ), @EventData.value( '(/EVENT_INSTANCE/SchemaName)[1]' , 'varchar(100)' ), @EventData.value( '(/EVENT_INSTANCE/DatabaseName)[1]' , 'varchar(100)' ), @EventData.value( '(/EVENT_INSTANCE/ObjectName)[1]' , 'varchar(100)' ), @EventData.value( '(/EVENT_INSTANCE/ObjectType)[1]' , 'varchar(100)' ), @EventData.value( '(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]' , 'varchar(max)' ), @EventData ) GO ENABLE TRIGGER [trg_DDL_audit] ON DATABASE GO |
--禁用当前数据库中所有数据库级别的 DDL 触发器:
DISABLE TRIGGER ALL ON DATABASE
--禁用服务器实例中所有服务器级别的 DDL 触发器:
DISABLE TRIGGER ALL ON ALL SERVER
SELECT * FROM sys.server_triggers
ENABLE Trigger ALL ON ALL SERVER;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具