sql-server - 仅当 SQL Server 中满足条件时才触发触发器

标签 sql-server triggers

我希望这对于任何 SQL 人员来说都是一个足够简单的问题...

我们有一个保存系统配置数据的表,它通过触发器与历史表绑定(bind),这样我们就可以跟踪谁更改了什么以及何时更改。

我需要向该表中添加另一个值,但它会经常从代码中更改,并且要求我们不跟踪它的历史记录(我们不想用每天有数千条更新。

目前,我们的触发器有点像这样......

CREATE TRIGGER 
    [dbo].[SystemParameterInsertUpdate]
ON 
    [dbo].[SystemParameter]
FOR INSERT, UPDATE 
AS
  BEGIN
    SET NOCOUNT ON
      INSERT INTO SystemParameterHistory 
      (
        Attribute,
        ParameterValue,
        ParameterDescription,
        ChangeDate
      )
    SELECT
      Attribute,
      ParameterValue,
      ParameterDescription,
      ChangeDate
    FROM Inserted AS I
END

如果属性列值以特定字符串(例如“NoHist_”)为前缀,我希望能够添加一些逻辑来阻止它创建记录

鉴于我几乎没有使用触发器的经验,我想知道如何最好地实现这个...我尝试了如下的 where 子句

where I.Attribute NOT LIKE 'NoHist_%'

但似乎不起作用。该值仍会复制到历史表中。

如果您能提供任何帮助,我们将不胜感激。

<小时/>

好的 - 正如 Cade Roux 所预测的那样,这在多次更新中都失败了。我将不得不采取新的方法来解决这个问题。请问大家还有什么建议吗?

<小时/>

各位 - 请在这里教育我...为什么在这种情况下 LEFT() 比 LIKE 更好?我知道我已经接受了答案,但我想知道我自己的教育。

最佳答案

鉴于 WHERE 子句不起作用,也许这会:

CREATE TRIGGER 
    [dbo].[SystemParameterInsertUpdate]
ON 
    [dbo].[SystemParameter]
FOR INSERT, UPDATE 
AS
  BEGIN
    SET NOCOUNT ON

      If (SELECT Attribute FROM INSERTED) LIKE 'NoHist_%'
      Begin
          Return
      End

      INSERT INTO SystemParameterHistory 
      (
        Attribute,
        ParameterValue,
        ParameterDescription,
        ChangeDate
      )
    SELECT
      Attribute,
      ParameterValue,
      ParameterDescription,
      ChangeDate
    FROM Inserted AS I
END

关于sql-server - 仅当 SQL Server 中满足条件时才触发触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/280904/

相关文章:

sql-server - 连接日志

sql - Oracle数据库-确定哪个表触发了触发器

MySQL 创建触发器(包括变量)语法

c# - 在 WPF 中使用具有多个值的 DataTrigger

C# SQL - 表列枚举和 JOIN

java - JAVA中的特殊字符

sql - 使用 SQL 搜索字符串中的单词数

SQL Server - 查询短路?

mysql - 在触发器中打印消息

knockout.js - knockout : ScrollIntoViewTrigger