Как найти столбцы, затронутые в операторе обновления SQL Server - PullRequest
0 голосов
/ 20 января 2012

У меня есть столбцы таблицы журнала, как показано ниже

   [Id]      
  ,[Attribute]
  ,[Action]
  ,[OldValue]
  ,[NEwValue]
  ,[UserId]
  ,[ModifiedDate]

где id - это затронутый идентификатор строки. Атрибут - это столбец, на который влияют. Действие - «вставить» или «обновить» в зависимости от типа выполняемой операции. В случае обновления старое значение и новое значение обновляемого столбца должны быть вставлены в столбцы newValue и старые значения в таблице журнала.

Ват - лучший способ достичь этого. Должен ли я пойти на триггеры или хранимую процедуру.?

Ответы [ 3 ]

2 голосов
/ 20 января 2012

Попробуйте следующий пример кода

-- Temp table to track changes
DECLARE  @tmpTable TABLE
(
     [Id]  INT   IDENTITY(1,1)     
    ,[Attribute]   VARCHAR(10)
    ,[Action]   VARCHAR(50)
    ,[OldValue]   VARCHAR(50)
    ,[NEwValue]   VARCHAR(50)
    ,[UserId]   INT 
    ,[ModifiedDate]  DATETIME

)

-- Actual/Transaction table
DECLARE @tblMyTable TABLE
(
        ID INT IDENTITY(1,1),
        Name VARCHAR(50)
)

-- Sample insert query
INSERT      INTO    @tblMyTable
OUTPUT      'Name'
            ,'Inserted'
            ,NULL -- Old value is null
            ,inserted.Name
            ,1 -- user ID
            ,GETDATE()

INTO        @tmpTable 
VALUES      ('New Name');


-- Sample update query
UPDATE      @tblMyTable
SET         Name = 'Updated Name'
OUTPUT      
            'Name'
            ,'Updated'
            ,deleted.Name -- Old value is null
            ,inserted.Name
            ,1 -- user ID
            ,GETDATE()

INTO        @tmpTable


select * from @tblMyTable
select * from @tmpTable
2 голосов
/ 20 января 2012

я нашел решение.размещать здесь другие пользователи используют

 CREATE TRIGGER [dbo].[tb_sample_UpdationTrigger] on [dbo].[tb_sample]  for UPDATE
    as
     if UPDATE(R_Id) 
     insert into dbo.test_log(Attribute,Action,OldValue,NEwValue,UserId,ModifiedDate)
    (SELECT 'R_Id','update', d.R_Id, i.R_Id ,1,GETDATE()
    FROM inserted i
    INNER JOIN deleted d ON d.id=i.id
    INNER JOIN tb_sample ON tb_sample.id=i.id)
2 голосов
/ 20 января 2012

Проверяли ли вы «сбор данных изменений», введенный в SQL Server 2008? - http://msdn.microsoft.com/en-us/library/bb522489.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...