2010-12-26 6 views
0

一部の列を含む表があります。アーカイブの目的のために、私は通常同じように見える2番目のテーブルを作成しますが、私はさらにPrimary KeyUsername/DateTimeを追加します。すべての編集後、私は多かれ少なかれ、そのように見えるプロシージャを呼び出す:SQL Serverのすべての列を入力せずに行の内容を別の表にコピーする方法

CREATE PROCEDURE [dbo].[sto_archiwizujPodmiot] 
    @varPodmiotID INT, @varUzytkownik NVARCHAR(50), @varUzytkownikData DATETIME 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

INSERT INTO [dbo].[PodmiotyHistoria] 
      ([PodmiotID] 
      ,[PodmiotOsobaNazwisko] 
      ,[PodmiotOsobaImie] 
      ,[PodmiotUzytkownik] 
      ,[PodmiotUzytkownikData]) 
SELECT [PodmiotID] 
     ,[PodmiotOsobaNazwisko] 
     ,[PodmiotOsobaImie] 
     ,@varUzytkownik 
     ,@varUzytkownikData 
    FROM [dbo].[Podmioty] 
WHERE [PodmiotID] = @varPodmiotID 
END 

私は私がアーカイブを持っている必要があり、すべて単一のテーブルのような手順を作成します。たとえば、更新が行われる前に誰かがいくつかのフィールドを編集しようとしている場合、私はこのプロシージャを呼び出します。問題は、1つのテーブルごとにこれを作成することです。 TableNameArchiveTableNameUsernameDateTimeなどのパラメータを指定するだけで、すべての単一のテーブルに対して呼び出すことができる、またはそれは私が毎回やるべきことですか?もっと一般化されたプロシージャを作成する方法はありますか?

答えて

2

このように監査テーブルはtriggersで行うのが最適です。

このようなテーブルごとにトリガーを作成する必要があります。

私は、提供されたテーブルのトリガーコードを自動的に生成するスクリプトを持つfollowing articleが見つかりました。

+0

C#からトリガーに値を渡すことはできますか? UsernameとDateTimeはC#プログラムから来ています。 – MadBoy

+1

@MadBoy - 追加のパラメータをトリガに供給することはできません。現在の 'DateTime'では、SQLの' GETDATE() '関数を使用することができます。 – Oded

+0

次に、プログラムからユーザー名が必要なので、ストアドプロシージャを使用し続ける必要があります。プログラムは誰が変更を行ったかを知る必要があります。 – MadBoy

関連する問題