Sql server 使用触发器进行更新

Sql server 使用触发器进行更新,sql-server,tsql,Sql Server,Tsql,人们告诉我,使用触发器是资源密集型的,而且成本高昂。在我的特殊情况下,我很难理解为什么会这样。我最近不得不向大约50个表(modifiedby、modifieddate、createdby和createddate)添加“审计字段”。为了避免我们组织内的每个存储过程和程序在所有情况下都必须添加修改人和修改日期代码,我建议在每个表上创建以下触发器。我想我的问题是:为什么这是不好的做法 CREATE TRIGGER [dbo].[ctlgroups_update] on [results].[dbo]

人们告诉我,使用触发器是资源密集型的,而且成本高昂。在我的特殊情况下,我很难理解为什么会这样。我最近不得不向大约50个表(modifiedby、modifieddate、createdby和createddate)添加“审计字段”。为了避免我们组织内的每个存储过程和程序在所有情况下都必须添加修改人和修改日期代码,我建议在每个表上创建以下触发器。我想我的问题是:为什么这是不好的做法

CREATE TRIGGER [dbo].[ctlgroups_update] on [results].[dbo].[ctlgroups]
FOR UPDATE
AS
BEGIN
    DECLARE @SystemUser varchar(50)
    DECLARE @EmployeeID INT
    SELECT @SystemUser = REPLACE(system_user,'RTI\','')
    SET @EmployeeID = (select top(1) employeeid from ctlemployees with(nolock)
                         where lastname = reverse(SUBSTRING(REVERSE(@SystemUser),1,charindex('.',REVERSE(@systemuser))-1))
                           and firstname = SUBSTRING(@SystemUser,1,charindex('.',@systemuser)-1))

    UPDATE ctlgroups
    set    ctlgroups.modifieddate = GETDATE(),
           ctlgroups.modifiedby = ISNULL(@employeeid,inserted.createdby)
    FROM   inserted
    WHERE  ctlgroups.groupID = inserted.groupid
END

如果你真的需要审计,你通常会意识到那些
modified\uuuu
列是不够的-它们告诉你谁在一行中做了最后一件事,但它们不让你知道最后一个用户,但只有一个用户实际执行了你想要查看的破坏性更新。在这些情况下,更重要的是告诉你什么时候进行了更新,这样我只能选择在特定时间段内修改/创建的记录。但您要包括用户标识。变更跟踪不需要这样做;您应该考虑/使用内置的机制来跟踪变化,而不是手工实现。我知道我听起来很挑剔,但听起来好像你不清楚你到底需要在这里实现什么。