代码之家  ›  专栏  ›  技术社区  ›  Todd Moses

SQL Server中触发器的替代方案

  •  3
  • Todd Moses  · 技术社区  · 16 年前

    我有一个数据库,需要在insert上添加一些附加值。插入由编译代码控制,不能更改。

    示例:程序插入一个字符串,我需要从该字符串向指向查找表的新字段提供一个整数。

    如果有一个触发器的替代方案,那么请让我知道任何替代方案的优点和缺点。主要原因是我们的DB标准中不允许使用触发器。

    8 回复  |  直到 16 年前
        1
  •  3
  •   marc_s MisterSmith    16 年前

    如何根据插入的字符串确定整数?

    computed columns in SQL Server . 如果该匹配非常简单(例如,从字符串中提取字符10到14)或类似的内容,则可以自动创建一个计算列来执行此操作—无需触发器。

    您甚至可以持久化这些计算列(物理存储为表的一部分),并在这些字段上创建索引!

        2
  •  6
  •   Welbog    16 年前

    可以使用存储过程、触发器或更复杂的insert语句来替代普通的旧insert。由于您无法控制insert语句,因此也无法使用存储过程。所以你唯一的选择就是触发器。

    你所描述的正是触发器存在的原因。如果您需要完成此任务,则无法在您列出的约束条件下完成。

    触发器是最好的选择。更改数据库标准(或至少允许此任务成为例外),因为它们有缺陷。

        3
  •  2
  •   Bernhard    7 年前

    MSDN 介绍。另一种选择,但只有在2008年R2之后才有效,“变更跟踪” Setting up change tracking look here )改变了什么,这可能会也可能不会“解决”触发器的问题。

        4
  •  1
  •   delfuego    16 年前

    触发器是 SQL表上发生事件(插入、更新、删除)后执行操作的方式;事实上,他们的存在使得不可能有任何站得住脚的替代方案。遗憾的是,您所说的DB标准实际上阻止了您做您想做的事情,而没有运行一些进程来定期监视您的表,然后执行您需要它执行的操作,或者更改所有数据库CrUD操作以通过执行您想让它们做的存储过程。既然你说后者是不可能的,你就不能改变 INSERT

        5
  •  1
  •   Bridge user2173966    10 年前

    SQLServer2005现在有一个名为OUTPUT子句的东西,它可以在插入(或其他操作)发生后执行额外的处理。这 article 涵盖更多细节。例如,如果需要在INSERT命令之后进行处理,可以执行以下操作。。。

    INSERT INTO Contact
    (FirstName, MiddleName, LastName)
    
    OUTPUT INSERTED.ContactID, INSERTED.FirstName, INSERTED.MiddleName, INSERTED.LastName
    INTO Contact_Audit    
    VALUES
    (@@SCOPE_IDENTITY, 'Joe', 'D.', 'Schmoe')
    

    您将拥有为它们创建的唯一ID。

        6
  •  -2
  •   Randy Minder    16 年前

    你的选择在这里是有限的。我认为您唯一的其他选择是通过存储过程调用进行插入,并将额外的代码放入存储过程中。

        7
  •  -4
  •   Devin_Louis    9 年前

    我认为我们现在可以用hibernate事件系统实现触发器,尽管会对性能造成影响。我以前没有这样做过,但我认为它可以工作