2016-03-30 9 views
0

db内の行を変更したユーザーを取得することは可能ですか?私はModifiedOn日付を得ることができます。私のコードは以下の通りです。 Table1ModifiedBy列を持っている場合テーブル更新時に変更者を取得

​​
+1

あなたは情報を明示的な列がない限り、データベースはテーブルにこれを保存しません。ログ・ファイル(フル・ログオンしている場合)または監査表に保管することもできます。 –

+0

[データの変更をキャプチャするSQL Serverログツール](http://www.kodyaz.com/articles/log-data-changes-using-change-data-capture-for-sql-server-2005)で解決策を確認してください。 .aspx)ここで、基本トリガー構造は、データが機密とみなされ、ログの変更がトレースされるテーブルに使用されます。 – Eralper

答えて

1

は、挿入、更新後に変更された列を識別するために働くSQL trigger内の表に、コマンドを削除する必要があり、あなたが適用されます使用することができますロジック私はColumnAの場合はDataTableのテーブル のPKフィールドであると仮定このサンプルで

create trigger tr_DataTable on DataTable after update, insert, delete 
as 
begin 

select 
    ColumnA = case when i.ColumnA = d.ColumnA then 'not changed' else 'changed' end, 
    ColumnB = case when i.ColumnB = d.ColumnB then 'not changed' else 'changed' end 
from inserted i 
full outer join deleted d on i.ColumnA = d.ColumnA 

end 

挿入フィールドの値がとは異なり、これは関連分野のデータを示し、その後フィールドの値を削除したSQLがColumns_Updatedを使用して更新の列を決定するための手段を提供しますが、それはビット単位であると私は適用することは難しい

が更新されます。だから私は上記の論理を好む

alter trigger tr_DataTable on DataTable after update, insert, delete 
as 
begin 

select 
    FirstColumn = case when COLUMNS_UPDATED() & 2^0 = 0 then 'not changed' else 'changed' end, 
    SecondColumn = case when COLUMNS_UPDATED() & 2^1 = 0 then 'not changed' else 'changed' end 

end 
1

、そしてこれは、

UPDATE Table1 
SET ModifiedOn = CURRENT_TIMESTAMP, 
     ModifiedBy = SUSER_SNAME() 
FROM Table1 c 
     INNER JOIN INSERTED i 
     ON c.accID = i.accID 
+0

多くのありがとうございます。それでは、どの列が「Modified」であるかを見つけることは可能でしょうか? – AndroidAL

関連する問題