SQL Server数据库级别触发器

本文详细介绍了如何使用SQL Server的DDL触发器来监控和限制数据库中的表结构更改,包括创建、修改和删除表的操作。通过具体示例,展示了如何设置触发器以记录这些活动,并确保只有特定用户组才能执行DDL操作。
摘要由CSDN通过智能技术生成

禁止修改表结构和加表

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;

 

转载于:https://www.cnblogs.com/weifeng123/p/9916580.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值