0
Sr. ID   FName    LName    Mark
1   P1   amar     ranjan   100
2   P2   sameer   kumar    200
3   P1   amar     ranjan   200

Here I updated the first row for Mark column.

On each update to a single row I am creating the new row (see row 3) with updated value. Is it possible to get the column name which have been updated in the table?

4

3 に答える 3

1

出発点として、MahmoudGamalの回答とSQLFiddleデモを使用しました。

必要なことは可能ですが、更新プロセスにアクセスできる場合は、変更をテーブルに直接保存するストアドプロシージャで更新を管理することをお勧めします。

トリガーが必要な場合は、このようなものが機能しますが、ご覧のとおり、スコープとカーソルのために2つの一時テーブルという独自の欠点があります。

基本的に、毎回各列のチェックを生成し、列の新しい値と古い値を履歴テーブルに挿入します。

(ID列を主キーとIDに変更することもお勧めします)

SQLFIDDLEデモも作成しました

CREATE TABLE TableName (Sr INT, ID VARCHAR(10), FName VARCHAR(50),
LName VARCHAR(50), Mark VARCHAR(50));

CREATE TABLE HistoryTable (ID VARCHAR(10), ColumnName VARCHAR(50),
PrevValue VARCHAR(50), NewValue VARCHAR(50));



INSERT INTO TableName VALUES
(1, 'P1', 'amar', 'ranjan' , 100),
(2, 'P2', 'sameer', 'kumar', 200),
(3, 'P1', 'amar', 'ranjan', 200);



CREATE TRIGGER TableNameTrigger
ON TableName
AFTER UPDATE
AS 


SELECT * INTO #Deleted  FROM Deleted 
SELECT * INTO #Inserted FROM Inserted  

DECLARE @ColName varchar(64)
DECLARE columnCursor CURSOR FOR
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TableName' AND TABLE_SCHEMA='dbo'

OPEN columnCursor

FETCH NEXT FROM columnCursor INTO @ColName

WHILE (@@FETCH_STATUS <> -1)
BEGIN


EXEC(N'INSERT INTO HistoryTable 
     SELECT Deleted.Sr, ''' + @ColName + ''', Deleted.'+ @ColName + ',' + 'Inserted.' + @ColName +' 
     FROM #Deleted Deleted
     INNER JOIN #Inserted Inserted ON Inserted.Sr = Deleted.Sr
     WHERE Deleted.'+ @ColName + ' != Inserted.' + @ColName)




FETCH NEXT FROM columnCursor INTO @ColName

END


DROP TABLE #Deleted 
DROP TABLE #Inserted 

CLOSE columnCursor

DEALLOCATE columnCursor

GO
于 2012-11-12T15:04:42.623 に答える
1

SQL Server 2008 を使用しているため、OUTPUT句を使用して更新されたデータを取得できます。何かのようなもの:

UPDATE TableName
  SET Sr = 'foo',
      ID    = someid,
      FName = 'bar',
      LName = 'other foo',
      Mark  = someid
OUTPUT
  inserted.FName,
  deleted.FName AS oldFName,
  inserted.FName AS newFName
WHERE SR = 1; -- for mark;

ただし、別のテーブルに挿入する必要がある場合は、作成したデータを更新されたデータで履歴テーブルを更新するHistoryことができます。AFTER UPDATETRIGGER

USE DatabaseName;
GO
IF OBJECT_ID ('Sch.TableNameTrigger', 'TR') IS NOT NULL
   DROP TRIGGER Sch.TableNameTrigger;
GO
CREATE TRIGGER Sch.TableNameTrigger
ON FirstTable
AFTER UPDATE
AS 
    INSERT INTO HistoryTable
    SELECT * FROM DELETED
GO

SQL フィドルのデモ

于 2012-11-12T13:30:19.540 に答える
0

history という別のテーブルを作成し、いつ更新されたかを保存します。

1 つのテーブルに重複するエントリを作成するのは、悪い設計です。また、重複したエントリをどのように処理しているのかわかりませんか?

P1それをどのように処理しているかについてデータを印刷したいとしましょう。


編集 1

私の Web サイトの 1 つで、クライアントは、誰がいつ何を追加/編集/削除したかを知りたがっていました。そこで、HISTORY という新しいテーブルを作成し、追加/編集/削除が完了したら、そのテーブルにエントリを作成しています。1 人のユーザーに対して多くの行を作成するのは、悪い設計です。

于 2012-11-12T13:31:52.310 に答える