首页 > 数据库技术 > 详细

SQL Server数据库级别触发器

时间:2019-11-05 16:11:45      阅读:101      评论:0      收藏:0      [点我收藏+]

禁止修改表结构和加表

 

 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

创建操作监控表

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

--记录加的表和字段

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

 

SQL Server数据库级别触发器

原文:https://www.cnblogs.com/champaign/p/mssql-db-trigger.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!