Я мог бы написать триггер для таблицы, которая может обнаруживать обновленные столбцы и регистрирует изменения. Я хочу сделать хранимую процедуру из этого триггера и вызывать ее при необходимости. Но я не знаю, как я могу отправить «вставленные» или «обновленные» строки, которые действительны в теле триггера, этому SP. Вот мой триггер:
CREATE TRIGGER [dbo].[tgr_MyTable_TransactionLogUpdate]
ON [dbo].[MyTable]
AFTER UPDATE
AS
BEGIN
if (select F_SharhRadif from [Payeh.Decode] where F_ShJadval=18 and F_ShRadif=1)='2'
begin
return
end
declare @userid int=(select top 1 userid from inserted)
declare @computername nvarchar(50)=(select top 1 computername from inserted)
declare @ip nvarchar(50)=(select top 1 IP from inserted)
declare @zamantaqeer datetime=(select top 1 F_ZamanTaqeer from inserted)
declare @changetime =GETDATE()
DECLARE @tableID BIGINT=(SELECT id FROM sys.sysobjects WHERE [name]='MyTable')
DECLARE @ColCount INT=(SELECT COUNT(*) FROM sys.syscolumns WHERE id=@tableID)
DECLARE @ColIndex INT=1
DECLARE @UpdateDetails NVARCHAR(MAX)=''
DECLARE @ColName NVARCHAR(1000)
DECLARE @ByteIndex INT
SELECT * INTO #d FROM deleted
SELECT * INTO #i FROM inserted
WHILE (@ColIndex<=@ColCount)
BEGIN
--IF (COLUMNS_UPDATED()&POWER(2,@ColIndex-1) <> 0)
SET @ByteIndex=((@ColIndex-1)/8)+1
IF (CONVERT(INT,SUBSTRING(COLUMNS_UPDATED(),@ByteIndex,1))&POWER(2,((@ColIndex-1)%8)) <> 0)
BEGIN
SET @ColName=(SELECT [name] FROM sys.syscolumns WHERE id=@tableID AND colid=@ColIndex)
DECLARE @OldValue NVARCHAR(MAX)
DECLARE @NewValue NVARCHAR(MAX)
DECLARE @ParmDefinition NVARCHAR(100)=N'@DeletedValue NVARCHAR(MAX) OUTPUT'
DECLARE @SQL NVARCHAR(1000)='SELECT @DeletedValue=LTRIM(RTRIM(CONVERT(nvarchar(MAX),'+@ColName+'))) FROM #d'
EXEC sp_executesql @SQL,@ParmDefinition,@DeletedValue=@OldValue OUTPUT
SET @ParmDefinition = N'@InsertedValue NVARCHAR(MAX) OUTPUT'
SET @SQL= 'SELECT @InsertedValue=LTRIM(RTRIM(CONVERT(nvarchar(MAX),'+@ColName+'))) FROM #i'
EXEC sp_executesql @SQL,@ParmDefinition,@InsertedValue=@NewValue OUTPUT
IF (@OldValue<>@NewValue)
BEGIN
SET @UpdateDetails=@UpdateDetails+@ColName+': OLD="'+ @OldValue+'" -New="'+@NewValue+'", '
END
END
SET @ColIndex=@ColIndex+1
END
IF (LEN(@UpdateDetails)>0)
BEGIN
SET @UpdateDetails=SUBSTRING(@UpdateDetails,1,LEN(@UpdateDetails)-1)
END
ELSE
BEGIN
SET @UpdateDetails='No Changes'
END
--[User.TransactionLog] is the name of the table that stores the history of changes
INSERT INTO [User.TransactionLog]
([Tablename],[OperationType],[Desciption],[UserID],[ComputerName],[IP],[ChangeTime])
SELECT 'MyTable',2,@UpdateDetails,'',@userid,@computername,@ip, @changetime
DROP TABLE #d
DROP TABLE #i