2017-01-11 12 views
0

データベース内の各テーブルにトリガーを作成し、削除したデータのコピーを参照できる単一の「監査」テーブルに記録します。SQL ServerトリガーOn単一テーブルへの削除

私は周りを見てきましたが、列の定義が異なるため、すべてを1つのテーブルに挿入する方法が見つからないようです。

ご協力いただきまして誠にありがとうございます。

ありがとうございました

+0

[チェンジ・データ・キャプチャ](https://msdn.microsoft .com/ja-ja/library/cc645937(v = sql.110).aspx)を使用する方が良い方法かもしれません。 –

+0

残念ながら私たちは標準バージョンのSQL Serverのみを使用しており、エンタープライズ、デベロッパー、エンタープライズ評価版でしか利用できないため、これを行うことはできません – DaRoGa

+0

@DaRoGa 1つの方法で文字列を作成し、データベースに保存できます。文字列の形式は、{columnname:}:Oldvalue | NewValue {chnaged by:}現在のユーザー名のようになります。これを私のアプリケーションの1つに実装しましたが、各テーブルのトリガーごとに個別に実行する必要があります。もしあなたが好きなのであれば、私のトリガーがトリガされたので、古いや新しい価値を得ることができます。 –

答えて

1

これはサンプルコードです。私がここでやっていることは非常にユーザーがテーブル上で行う更新ですテーブルの更新時にSQLが保持するDeleted and Insertedテーブルから新しい値と古い値を取得しています。削除の場合は削除済み。

ALTER TRIGGER [SIR].[TESTTABLE_UPDATE] 
     ON [DBO].[TESTTABLE] 
    AFTER UPDATE 
    AS 
    BEGIN 
     IF (@@ROWCOUNT = 0) return SET NOCOUNT ON; DECLARE @USER VARCHAR(1000) 
     -- this is a function which can gives u current loggined user in case if someone update the data from backend we can get that user name and log it. 
     SET @USER='' SET @USER= (select dbo.GetCurrentUserName()) 

     --this is a filter for bulk update which systemm does and you dont care about it so return 
     if(PATINDEX('%workerprocess%',@USER)>0) return 

     DECLARE @ID INT , @LOGS VARCHAR(MAX) , @FINALLOGS VARCHAR(MAX)  DECLARE @ACTION VARCHAR(MAX)  
     SET @ACTION =''  SET @LOGS=''  SET @FINALLOGS ='' 
     SELECT @LOGS = DELETED.CHANGELOG FROM DELETED 
    -- individual column that a table contain 
    IF UPDATE([STATECODE]) 
     BEGIN 
      SET @Action += '| StateCode Changed from '+convert(varchar, (select isnull([STATECODE],'') FROM deleted )) +' to '+ convert(varchar, (select isnull([STATECODE],'') FROM inserted )) +' | ' 
     END 
    -- individual column that a table contain 
    IF UPDATE([FACILITYCODE]) 
     BEGIN 
      SET @Action += '| FacilityCode Changed from '+convert(varchar, (select isnull([FACILITYCODE],'') FROM deleted )) +' to '+ convert(varchar, (select isnull([FACILITYCODE],'') FROM inserted )) +' | ' 
     END 

    IF UPDATE([INSTALLATIONCODE]) 
     BEGIN 
      SET @Action += '| InstallationCode Changed from '+convert(varchar, (select isnull([INSTALLATIONCODE],'') FROM deleted )) +' to '+ convert(varchar, (select isnull([INSTALLATIONCODE],'') FROM inserted )) +' | ' 
     END 


      set @FINALLOGS =' [SIR.INSTALLATIONS Updated On ' + CONVERT(varchar(25), GETDATE()) + @ACTION + ISNULL(@LOGS,'') +' ] ' 



      -- this is my audit table where I am logging everything. 
      INSERT INTO SIR.UserChangeLog (UpdatedBy,ChangeLog) VALUES(@user, @FINALLOGS) 
    END 
---- End tirgger --------- 
1

監査テーブルを作成します。

CREATE TABLE [dbo].[MyAudit](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [TableName] [nvarchar](100) NOT NULL, 
    [ColumnName] [nvarchar](100) NOT NULL, 
    [DeletedValue] [sql_variant] NULL, 
    [ChangeDateTime] [datetime] NOT NULL, 
) 
GO 
ALTER TABLE [dbo].[MyAudit] ADD CONSTRAINT [DF_MyAudit_ChangeDateTime] DEFAULT (getdate()) FOR [ChangeDateTime] 

は、あなたが上で削除をログに記録したい各テーブルにトリガーを追加します。

CREATE TRIGGER [MyTrigger] 
    ON [MyTable] 
    AFTER DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 
    Insert into [MyAudit] ([Tablename], [ColumnName], [DeletedValue]) 
     Select 'MyTable', 'Column1', deleted.Column1 from deleted 
    Insert into [MyAudit] ([Tablename], [ColumnName], [DeletedValue]) 
     Select 'MyTable', 'Column2', deleted.Column2 from deleted 
--Do all columns until column x 
    Insert into [MyAudit] ([Tablename], [ColumnName], [DeletedValue]) 
     Select 'MyTable', 'ColumnX', deleted.ColumnX from deleted 
END 
関連する問題