Sql server 在表更新时被修改

Sql server 在表更新时被修改,sql-server,triggers,Sql Server,Triggers,是否可以获取在数据库中修改行的用户。我可以获得修改日期。我的代码如下 CREATE TRIGGER trgUpdate ON Table1 FOR UPDATE AS BEGIN IF @@ROWCOUNT = 0 RETURN IF TRIGGER_NESTLEVEL(object_ID('trgUpdate')) > 1 RETURN; SET NOCOUNT ON; UPDATE Table1 SET ModifiedOn = CURRENT_TIMESTAMP

是否可以获取在数据库中修改行的用户。我可以获得
修改日期。我的代码如下

CREATE TRIGGER trgUpdate
ON Table1
FOR UPDATE
AS
BEGIN
IF @@ROWCOUNT = 0   RETURN
IF TRIGGER_NESTLEVEL(object_ID('trgUpdate')) > 1  RETURN;
SET NOCOUNT  ON;



UPDATE Table1
SET    ModifiedOn = CURRENT_TIMESTAMP
FROM   Table1 c
       INNER JOIN INSERTED i
         ON c.accID = i.accID
END

如果
Table1
有一个
ModifiedBy
列,那么这应该可以工作

UPDATE Table1
SET    ModifiedOn = CURRENT_TIMESTAMP,
       ModifiedBy = SUSER_SNAME()
FROM   Table1 c
       INNER JOIN INSERTED i
         ON c.accID = i.accID

如果
Table1
有一个
ModifiedBy
列,那么这应该可以工作

UPDATE Table1
SET    ModifiedOn = CURRENT_TIMESTAMP,
       ModifiedBy = SUSER_SNAME()
FROM   Table1 c
       INNER JOIN INSERTED i
         ON c.accID = i.accID

要确定在中的表上执行insert、update、delete命令后更改了哪些列,可以使用应用逻辑

create trigger tr_DataTable on DataTable after update, insert, delete
as
begin

select
    ColumnA = case when i.ColumnA = d.ColumnA then 'not changed' else 'changed' end,
    ColumnB = case when i.ColumnB = d.ColumnB then 'not changed' else 'changed' end
from inserted i
full outer join deleted d on i.ColumnA = d.ColumnA

end
在这个示例中,我假设ColumnA是DataTable表的PK字段 如果插入的字段值与删除的字段值不同,则显示相关字段的数据已更新

虽然SQL提供了一种使用确定更新列的方法,但它是按位的,我发现很难应用。所以我更喜欢逻辑

alter trigger tr_DataTable on DataTable after update, insert, delete
as
begin

select
    FirstColumn = case when COLUMNS_UPDATED() & 2^0 = 0 then 'not changed' else 'changed' end,
    SecondColumn = case when COLUMNS_UPDATED() & 2^1 = 0 then 'not changed' else 'changed' end

end

要确定在中的表上执行insert、update、delete命令后更改了哪些列,可以使用应用逻辑

create trigger tr_DataTable on DataTable after update, insert, delete
as
begin

select
    ColumnA = case when i.ColumnA = d.ColumnA then 'not changed' else 'changed' end,
    ColumnB = case when i.ColumnB = d.ColumnB then 'not changed' else 'changed' end
from inserted i
full outer join deleted d on i.ColumnA = d.ColumnA

end
在这个示例中,我假设ColumnA是DataTable表的PK字段 如果插入的字段值与删除的字段值不同,则显示相关字段的数据已更新

虽然SQL提供了一种使用确定更新列的方法,但它是按位的,我发现很难应用。所以我更喜欢逻辑

alter trigger tr_DataTable on DataTable after update, insert, delete
as
begin

select
    FirstColumn = case when COLUMNS_UPDATED() & 2^0 = 0 then 'not changed' else 'changed' end,
    SecondColumn = case when COLUMNS_UPDATED() & 2^1 = 0 then 'not changed' else 'changed' end

end

数据库不会将其存储在表中,除非您有一个包含该信息的显式列。它也可能存储在日志文件(如果您已完全登录)或审核表中。请检查以下位置的解决方案:对于数据被视为敏感并跟踪日志更改的表,使用基本触发器结构。数据库不会将其存储在表中,除非您有一个包含信息的显式列。它也可能存储在日志文件(如果您已完全登录)或审核表中。请检查解决方案,其中基本触发器结构用于数据被视为敏感并跟踪日志更改的表。非常感谢,那么是否可以找到哪些列被修改了,然后是否可以找到哪些列被修改了?