我有一个包含表、字段和索引的 sql 数据库,它会不断地进行修改和修改。我希望能够在每次对内容进行任何更改时记录下来,包括被操作的特定表/字段数据的旧版本、新版本、日期和进行这些更改的用户。在表格视图中拥有一个输出格式,其中每一个都作为列是理想的。
在研究了如何做到这一点之后,似乎使用触发器是一个不错的方法。但是,我之前没有写过触发器或使用过 SQL。我将如何实施呢?
我正在使用 VS2008,C#。显然,我现在的问题非常广泛,因为我脑子里只有这个概念,不知道如何编写代码来做到这一点。
我有一个包含表、字段和索引的 sql 数据库,它会不断地进行修改和修改。我希望能够在每次对内容进行任何更改时记录下来,包括被操作的特定表/字段数据的旧版本、新版本、日期和进行这些更改的用户。在表格视图中拥有一个输出格式,其中每一个都作为列是理想的。
在研究了如何做到这一点之后,似乎使用触发器是一个不错的方法。但是,我之前没有写过触发器或使用过 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)')
)