sql >> データベース >  >> RDS >> Sqlserver

SQLサーバースキーマの監査?

    まさにこの種のことのためにDDLトリガーを使用するシステムがあります。それは私のニーズには十分に機能します。もともとはSQLServer2005で開発され、現在はSqlServer2008R2システム上にあります。これは、AaronBertrandのコメントのリンクで説明されているものと似ています。

    これに似たテーブルを作成します。

    CREATE TABLE [dbo].[SchemaLog](
        [SchemaLogID] [int] IDENTITY(1,1) NOT NULL,
        [PostTimeUtc] [datetime] NOT NULL,
        [DatabaseUser] [nvarchar](128) NOT NULL,
        [Event] [nvarchar](128) NOT NULL,
        [Schema] [nvarchar](128) NULL,
        [Object] [nvarchar](128) NULL,
        [TSQL] [nvarchar](max) NOT NULL,
        [XmlEvent] [xml] NOT NULL,
     CONSTRAINT [PK_SchemaLog_1] PRIMARY KEY CLUSTERED 
    (
        [SchemaLogID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    

    全員がテーブルへの挿入権限を持っていることを確認してから、これに似たddlトリガーを作成します。

    CREATE TRIGGER [ddlDatabaseTriggerLog] ON DATABASE  FOR DDL_DATABASE_LEVEL_EVENTS AS  
    BEGIN     
        SET NOCOUNT ON;     
        DECLARE @data XML;     
        DECLARE @schema sysname;     
        DECLARE @object sysname;     
        DECLARE @eventType sysname;     
        SET @data = EVENTDATA();     
        SET @eventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname');     
        SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');     
        SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')      
        IF @object IS NOT NULL         
            PRINT '  ' + @eventType + ' - ' + @schema + '.' + @object;     
        ELSE         
            PRINT '  ' + @eventType + ' - ' + @schema;     
    
        IF @eventType IS NULL         
            PRINT CONVERT(nvarchar(max), @data);     
    
        INSERT [dbo].[SchemaLog]          (         
            [PostTimeUtc]
        ,          [DatabaseUser]
        ,          [Event]
        ,          [Schema]
        ,          [Object]
        ,          [TSQL]
        ,          [XmlEvent]         )      
        VALUES          (         
            GETUTCDATE()
        ,          CONVERT(sysname, CURRENT_USER)
        ,          @eventType
        ,          CONVERT(sysname, @schema)
        ,          CONVERT(sysname, @object)
        ,          @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')
        ,          @data         ); 
    
    END;
    

    変更を順番に選択するために表示

    create view SchemaLogOrdered
    as
    SELECT top 10000 *
    FROM            dbo.SchemaLog
    ORDER BY  SchemaLogID DESC
    


    1. コマンドラインからデータベースをエクスポートするにはどうすればよいですか?

    2. LinqToSqlを使用してデータベースレコードを返しますか?

    3. 移行中にデータベースが構成されていないlaravel

    4. SQLServer再帰クエリ