记录对SQL数据库所做的更改

记录对SQL数据库所做的更改,sql,database,triggers,ddl-trigger,Sql,Database,Triggers,Ddl Trigger,我有一个包含表、字段和索引的sql数据库,这些数据库不断地被修改和修改。我希望能够在每次对内容进行任何更改时记录日志,包括操作的特定表/字段数据的旧版本、新版本、日期以及进行这些更改的用户。在表的视图中使用输出格式,并将这4项内容分别作为列是理想的 在研究了如何做到这一点之后,使用触发器似乎是一个很好的方法。但是,我以前没有编写触发器或使用SQL。我将如何着手实施这一点 我正在使用VS2008,c#。显然,我现在的问题非常广泛,因为我脑子里只想着这个概念,不知道如何编写代码来实现它 假设Sql

我有一个包含表、字段和索引的sql数据库,这些数据库不断地被修改和修改。我希望能够在每次对内容进行任何更改时记录日志,包括操作的特定表/字段数据的旧版本、新版本、日期以及进行这些更改的用户。在表的视图中使用输出格式,并将这4项内容分别作为列是理想的

在研究了如何做到这一点之后,使用触发器似乎是一个很好的方法。但是,我以前没有编写触发器或使用SQL。我将如何着手实施这一点


我正在使用VS2008,c#。显然,我现在的问题非常广泛,因为我脑子里只想着这个概念,不知道如何编写代码来实现它

假设Sql Server-下面是一个创建DDL触发器的示例

首先,创建一个表来保存日志

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)')
)

假设Sql Server—下面是一个创建DDL触发器的示例

首先,创建一个表来保存日志

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)')
)

这是为哪个RBDMS设计的?但它是MySql、Sql Server、Oracle等吗?这是为哪个RBDMS设计的?但它是为MySql、Sql Server、Oracle等设计的吗。。。