【问题标题】:Syntax Error Creating Trigger - Column Specification创建触发器的语法错误 - 列规范
【发布时间】:2017-03-28 18:33:28
【问题描述】:

下面的触发器定义有什么问题?我打算在更新或插入“日期”列时执行“calculate_dow”函数,但它会生成以下错误...

CREATE TRIGGER tr_calculate_dow
    AFTER UPDATE OR INSERT OF date ON focusblu.events
    FOR EACH ROW
    EXECUTE PROCEDURE calculate_dow(date);

执行 SQL 失败:SQL CREATE TRIGGER tr_calculate_dow AFTER UPDATE OR INSERT OF date ON focusblu.events FOR EACH ROW EXECUTE PROCEDURE calculate_dow(date);失败:错误:“OF”第 1 行或附近的语法错误:...IGGER tr_calculate_dow 更新或插入日期后... ^

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    错误说你有一个语法错误:你不能在那里使用OF

    文档非常清楚您想要什么,甚至还有基于您的“每当日期列更新”标准的示例:

    https://www.postgresql.org/docs/9.1/static/sql-createtrigger.html

    也许你想要这样的东西?

    CREATE TRIGGER tr_calculate_dow
      AFTER UPDATE ON focusblu.events
      FOR EACH ROW
      WHEN (OLD.date IS DISTINCT FROM NEW.date)
      EXECUTE PROCEDURE calculate_dow(NEW.date);
    

    您很可能也希望对另一个 INSERT 触发器执行相同的操作,然后选择日期。

    【讨论】:

      【解决方案2】:

      我假设您会在每次更新时更新日期,因此您不必指定date字段。

      CREATE TRIGGER tr_calculate_dow
          AFTER UPDATE OR INSERT ON focusblu.events
          FOR EACH ROW
          EXECUTE PROCEDURE calculate_dow(date);
      

      【讨论】:

      • 不完全是。每当插入或更新“日期”列时,我想使用“calculate_dow”函数更新另一列。
      • 但是,删除“OF 日期”条件确实消除​​了错误并且触发器现在可以工作。我想这对我的目的来说是可以的,但我不确定为什么我不能定义触发器仅在更新或插入“日期”时执行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多