[英]SQL server schema auditing?
我們有一個具有兩種不同架構的SQL Server 2008 Enterprise數據庫,一種是我們維護的鎖定模式,另一種是開放的,我們允許外部開發團隊根據自己的需要添加和修改。 通常,這對我們來說行得通,但一個特定的團隊喜歡將其弄糊塗,這會影響其他所有人。 所以有兩個問題:
謝謝
我有一個系統使用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.