比如我想监视表结构的修改,对字段的类型/大小以及增加字段/删除字段做监视,
如何获取监视的信息?我本来想在 syscolumns 上加触发器,
但建触发器时提示 “拒绝了对对象 'syscolumns'(数据库 'DocSystem',所有者 'dbo')的 CREATE TRIGGER 权限”该如何操作?

解决方案 »

  1.   

    syscolumns 是系统视图,不能改的。给个DDL触发器的语句你自己改。08版本的。用来监控整个库上对ddl操作的记录。需要写入另外一个库的表中做记录。记得不要直接抄,改一下:
     
     
     
     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