日期:2014-05-17  浏览次数:20472 次

如何监视表结构的修改?
比如我想监视表结构的修改,对字段的类型/大小以及增加字段/删除字段做监视,
如何获取监视的信息?

我本来想在 syscolumns 上加触发器,
但建触发器时提示 “拒绝了对对象 'syscolumns'(数据库 'DocSystem',所有者 'dbo')的 CREATE TRIGGER 权限”

该如何操作?

------解决方案--------------------
syscolumns 是系统视图,不能改的。

给个DDL触发器的语句你自己改。08版本的。用来监控整个库上对ddl操作的记录。需要写入另外一个库的表中做记录。记得不要直接抄,改一下:


 
 
 
SQL code
 CREATE TRIGGER [DDLTriggertTrace] ON DATABASE
 --捕获存储过程、视图、表的创建、修改、删除动作
     FOR DDL_DATABASE_LEVEL_EVENTS
 AS
     BEGIN
         SET NOCOUNT ON ;
         DECLARE @EventData XML = EVENTDATA() ;--返回有关服务器或数据库事件的信息,以XML格式保存。
         DECLARE @ip VARCHAR(32) = ( SELECT  client_net_address
                                     FROM    sys.dm_exec_connections
                                     WHERE   session_id = @@SPID 
                                   ) ;
         --记录所有操作到表中
         INSERT  AuditDB_DBA.dbo.DDLEvents
                 ( EventType ,
                   EventDDL ,
                   EventXML ,
                   DatabaseName ,
                   SchemaName ,
                   ObjectName ,
                   HostName ,
                   IPAddress ,
                   ProgramName ,
                   LoginName
                 )
                 SELECT  @EventData.value('(/EVENT_INSTANCE/EventType)[1]',
                                          'NVARCHAR(100)') ,
                         @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]',
                                          'NVARCHAR(MAX)') ,
                         @EventData ,
                         DB_NAME() ,
                         @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',
                                          'NVARCHAR(255)') ,
                         @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',
                                          'NVARCHAR(255)') ,
                         HOST_NAME() ,
                         @ip ,
                         PROGRAM_NAME() ,
                         SUSER_SNAME() ;
                         
         --由于存在作业,DBA操作,导致devuser帐号记录过多,所以删除devuser的数据
         DELETE FROM AuditDB_DBA.dbo.DDLEvents WHERE LoginName in ('erpuser','sqlagent');
     END