簡體   English   中英

SQL Server模式審核?

[英]SQL server schema auditing?

我們有一個具有兩種不同架構的SQL Server 2008 Enterprise數據庫,一種是我們維護的鎖定模式,另一種是開放的,我們允許外部開發團隊根據自己的需要添加和修改。 通常,這對我們來說行得通,但一個特定的團隊喜歡將其弄糊塗,這會影響其他所有人。 所以有兩個問題:

  1. 事后看來,我希望我們從一開始就建立一些強大的功能,但我們沒有,只是默認安裝。 即使它像“用戶XYZ更改了2012年12月12日上午9:00的過程ABC”那樣簡單,也能夠看到到目前為止對模式所做的工作將非常高興。 SQL Server中是否內置了任何功能,並且默認情況下啟用了這些功能,這些功能可以跟蹤我們可能利用的功能,如果可以,在哪里/如何使用?
  2. 就長期解決方案而言,您對此有何建議? 我一直在閱讀DDL觸發器,這似乎是一個很有前途的選擇。 如果您使用了這種方法,是否可以分享一下它的工作原理以及可以做什么?

謝謝

我有一個系統使用DDL觸發器來處理這類事情。 它足以滿足我的需求。 它最初是在Sql Server 2005上開發的,現在可以在Sql Server 2008R2系統上使用。 它類似於Aaron Bertrand的評論中的鏈接所描述的內容。

創建一個與此表類似的表。

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

Redgate選項如下。

1)開始審核架構更改的最簡單方法是安裝DLM Dashboard 這是一個免費工具,可使用DDL觸發器來警告和記錄所有更改,並將包含您要求的信息。

2)正如安迪·戴維斯(Andy Davies)所提到的那樣,正確的方法是以與對應用程序代碼相同的方式開始對模式進行源代碼控制。 完成此操作后,可以通過將數據庫包括在持續集成和發布管理實踐中來增加數據庫生命周期管理的成熟度。

您可以看看將數據庫置於源代碼控制之下。 也許讓每個外部團隊都采用數據庫的一個分支或分支。 這使您可以通過提交來審核更改,並可以選擇要合並的更改和/或在合並之前查看/編輯這些更改。

http://www.red-gate.com/products/sql-development/sql-source-control/中查找一種可用的產品。

結合Github或Bitbucket之類的解決方案,可以通過Internet更直接地向外部貢獻者開放您的源代碼控制存儲庫。

對於第二個問題,您可以考慮將觸發器作為一個選項。 在下面的示例中,使用SQL Server的EVENTDATA()函數捕獲有關觸發觸發器的事件的信息。 SQL腳本創建DDL觸發器,以捕獲數據庫級別的CREATE,ALTER和DROP事件(盡管可以在服務器級別創建觸發器以捕獲服務器上所有數據庫的事件;應使用ON ALL SERVER選項,而不是ON在數據庫上)

CREATE TRIGGER Audit_DDL ON DATABASE
FOR CREATE_TABLE , ALTER_TABLE , DROP_TABLE
AS
DECLARE
@event xml;
SET @event = EVENTDATA(
                  );
INSERT INTO Audit_DDL_Events
VALUES( REPLACE( CONVERT( varchar( 50
                             ) , @event.query( 'data(/EVENT_INSTANCE/PostTime)'
                                             )
                    ) , 'T' , ' '
           ) , 
    CONVERT( varchar( 150
                    ) , @event.query( 'data(/EVENT_INSTANCE/LoginName)'
                                    )
           ) , 
    CONVERT( varchar( 150
                    ) , @event.query( 'data(/EVENT_INSTANCE/UserName)'
                                    )
           ) , 
    CONVERT( varchar( 150
                    ) , @event.query( 'data(/EVENT_INSTANCE/DatabaseName)'
                                    )
           ) , 
    CONVERT( varchar( 150
                    ) , @event.query( 'data(/EVENT_INSTANCE/SchemaName)'
                                    )
           ) , 
    CONVERT( varchar( 150
                    ) , @event.query( 'data(/EVENT_INSTANCE/ObjectName)'
                                    )
           ) , 
    CONVERT( varchar( 150
                    ) , @event.query( 'data(/EVENT_INSTANCE/ObjectType)'
                                    )
           ) , 
    CONVERT( varchar( max
                    ) , @event.query( 'data(/EVENT_INSTANCE/TSQLCommand/CommandText)'
                                    )
           )
  );

還必須為EVENTDATA XML中的審核數據創建一個適當的存儲表:

CREATE TABLE Audit_DDL_Events( DDL_Event_Time datetime , 
                           DDL_Login_Name varchar( 150
                                                 ) , 
                           DDL_User_Name varchar( 150
                                                ) , 
                           DDL_Database_Name varchar( 150
                                                    ) , 
                           DDL_Schema_Name varchar( 150
                                                  ) , 
                           DDL_Object_Name varchar( 150
                                                  ) , 
                           DDL_Object_Type varchar( 150
                                                  ) , 
                           DDL_Command varchar( max
                                              )
                         );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM