出発点として、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