2012-12-18 57 views
1

我有一個sql數據庫,其中包含表格,字段和索引,這些數據庫經常處理和修改。我希望每次對內容進行更改時都能夠記錄日誌,包括舊版本的特定表格/字段數據,新版本,日期和進行這些更改的用戶。將表格視圖中的輸出格式與這四列中的每一列作爲列都是理想的。對SQL數據庫所做的日誌記錄更改

在研究這將如何完成後,似乎使用觸發器是一個好方法。但是,我沒有寫過觸發器或之前使用過的SQL。我將如何去實施這個?

我正在使用VS2008,c#。很明顯,我的問題現在非常廣泛,因爲我只是想到了這個概念,不知道如何編寫代碼來完成它。

+0

這RBDMS這是什麼? –

+0

它是關係型 – Hyung

+1

但它是MySql,Sql Server,Oracle等等...... –

回答

1

假設Sql服務器 - 下面是創建DDL觸發器的示例,based on this article

首先,創建一個表來保存日誌...

CREATE TABLE [dbo].[ChangeLog](
    [LogId] [int] IDENTITY(1,1) NOT NULL, 
    [DatabaseName] [varchar](256) NOT NULL, 
    [EventType] [varchar](50) NOT NULL, 
    [ObjectName] [varchar](256) NOT NULL, 
    [ObjectType] [varchar](25) NOT NULL, 
    [SqlCommand] [varchar](max) NOT NULL, 
    [EventDate] [datetime] NOT NULL CONSTRAINT 
     [DF_EventsLog_EventDate] DEFAULT (getdate()), 
    [LoginName] [varchar](256) NOT NULL, 
    [UserName] [varchar](256) NULL, 
    CONSTRAINT [PK_ChangeLog] PRIMARY KEY CLUSTERED ([LogId] ASC) 
) 

接下來,創建觸發器...

CREATE TRIGGER [TrgDDLChangeLog] 
ON DATABASE 
FOR 

    CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE, 
    CREATE_TABLE, ALTER_TABLE, DROP_TABLE, 
    CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION, 
    CREATE_VIEW, ALTER_VIEW, DROP_VIEW, 
    CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER, 
    CREATE_INDEX, ALTER_INDEX, DROP_INDEX 

AS 

DECLARE @Event XML 
SET @Event = EVENTDATA() 

INSERT INTO dbo.ChangeLog 
(
    DatabaseName, 
    EventType, 
    ObjectName, 
    ObjectType, 
    SQLCommand, 
    LoginName, 
    UserName 
) 
VALUES 
(
    @Event.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'VARCHAR(256)'), 
    @Event.value('(/EVENT_INSTANCE/EventType)[1]', 'VARCHAR(50)'), 
    @Event.value('(/EVENT_INSTANCE/ObjectName)[1]', 'VARCHAR(256)'), 
    @Event.value('(/EVENT_INSTANCE/ObjectType)[1]', 'VARCHAR(25)'), 
    @Event.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'VARCHAR(max)'), 
    @Event.value('(/EVENT_INSTANCE/LoginName)[1]', 'VARCHAR(256)'), 
    @Event.value('(/EVENT_INSTANCE/UserName)[1]', 'VARCHAR(256)') 
)