0

データに加えられた特定の変更を追跡する必要がある SQL Server 2008 R2 データベースがあります。これまでのすべての調査により、行われたすべての変更を非常に複雑に追跡する方法が明らかになりましたが、私の場合はもう少し具体的で、(管理者によって) 承認されるまで変更を追跡するだけでよいため、より単純だと思います。 .

これを行うために私が考えることができる唯一の方法は、影響を受けるテーブルごとに、変更のタイプ (つまり、または)、主キー、列名、および該当する場合は値pending_changesを追跡するテーブルを作成することです。または変更する値。 INSERTUPDATEDELETE

次に、変更が承認されると、これから SQL ステートメントを生成して、変更をメイン テーブルに書き込むことができます。ただし、これは非常に不器用な方法のように感じられます。これを照会するのは困難です (たとえば、古い値と新しい値のリストを作成するなど)。

これは非常に小さなデータベース (< 1000000 行) で、ユーザーは 5 人ほどしかいないため、パフォーマンスは問題になりません。

編集: 変更を追跡する目的は、変更をデータベースに書き込む前に承認する必要があることです。データは主に法的な意味を持つ科学的なものであるため、ユーザー (この場合はクライアント) によって提案された変更は、承認される前に専門家によってチェックされる必要があります。それらが承認されると、古い値を知る必要がなくなります。DELETEステートメント を含むすべての変更には、この承認が必要です。INSERT変更されたデータを保持する同様のテーブルを作成することでUPDATE処理できますが、削除を処理する方法がわかりません。また、追跡する必要のあるベース テーブルがいくつかあるため、余分なテーブルが多くなりすぎないようにしたいと考えています。また、複雑さが増すことも心配しています。

4

2 に答える 2

0

「代わりに」トリガーを使用できます。

(未検証)

CREATE TRIGGER IO_Trig_INS_Employee ON Employee
INSTEAD OF INSERT
AS
BEGIN
  insert pending_employee
    select * from inserted
end

http://msdn.microsoft.com/en-us/library/ms175521(v=SQL.105).aspx

MERGEキーワードは、変更の適用に役立ちます。ただし、変更を行う前にトリガーをドロップする必要がある場合があります。

http://msdn.microsoft.com/en-us/library/bb510625.aspx

アプリケーションでこれを処理することを検討しましたか?Sharepointの承認ワークフローのようなものの方が適している場合があります。

于 2013-02-16T13:43:46.000 に答える
0

望ましくない変更が行われる前に防止する目的で、または変更後に値を確認/元に戻せるようにする目的で、変更を追跡していますか?

ユーザーに挿入/更新/削除を許可し、管理者に承認してもらっても問題ない場合は、OUTPUT INTO 句の使用を検討してください。このページの「C. UPDATE ステートメントで OUTPUT INTO を使用する」というラベルの付いたセクションに、すばらしい例があります: http://msdn.microsoft.com/en-us/library/ms177564.aspx

USE AdventureWorks2012;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE() 
OUTPUT inserted.BusinessEntityID,
       deleted.VacationHours,
       inserted.VacationHours,
       inserted.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

ご覧のとおり、これにより、各列の「前」と「後」の両方の値を記録できます。

于 2013-02-17T01:12:37.607 に答える