1

テーブル、フィールド、およびインデックスを含む sql データベースがあり、常に作業と改訂が行われています。操作された特定のテーブル/フィールド データの古いバージョン、新しいバージョン、日付、およびこれらの変更を行ったユーザーなど、コンテンツに変更が加えられるたびにログを記録できるようにしたいと考えています。これら 4 つのそれぞれを列として表のビューに出力形式を設定するのが理想的です。

これがどのように行われるかを調べたところ、トリガーを使用するのが良い方法のようです。ただし、トリガーを作成したことも、SQL を使用したこともありません。これを実装するにはどうすればよいですか?

私はVS2008、c#を使用しています。明らかに、私の質問は非常に幅広いものです。なぜなら、それを行うためのコードの書き方についての知識がなく、概念しか頭に浮かんでいないからです。

4

1 に答える 1

1

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)')
)
于 2012-12-18T00:19:54.437 に答える