【问题标题】:Why does this trigger fail? It says invalid identifier为什么这个触发器会失败?它说无效的标识符
【发布时间】:2011-07-08 13:59:00
【问题描述】:
CREATE MATERIALIZED VIEW ORDERS_MV
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND AS
SELECT * FROM ORDERS;
---------------------------------------

CREATE OR REPLACE TRIGGER update_ship_receive
INSTEAD OF INSERT ON ORDERS_MV
FOR EACH ROW
BEGIN
  UPDATE ORDERS SET EXPECTED_SHIP_DATE = ORDER_DATE+5;
  UPDATE ORDERS SET EXPECTED_RECEIVE_DATE = SHIP_DATE+1 
WHERE SHIPPING_METHOD = '1 DAY';
  UPDATE ORDERS SET EXPECTED_RECEIVE_DATE = SHIP_DATE+2
 WHERE SHIPPING_METHOD = '2 DAY';
  UPDATE ORDERS SET EXPECTED_RECEIVE_DATE = SHIP_DATE+5 
WHERE SHIPPING_METHOD = 'GROUND';
END;
/

【问题讨论】:

  • 错误消息至少会指出哪一行代码具有违规标识符。
  • 不是您的错误的原因,但第一个 UPDATE 语句将更新表中的每一行 - 这是您想要的吗?
  • @Jeffrey:有一个订单表,它没有这三列:expected_ship、expected_receive 和actual_receive。因此,我更改了 Orders 表以添加这三个属性。现在,对于订单表中的每个新插入,我必须确保自动更新 expected_ship 和 expected_receive。
  • 所以我创建了 Orders_MV,并创建了从 Orders_MV 获取信息的而不是触发器,并更新了 Orders 表。但由于某种原因,它对我不起作用。尽管我在 MV 上创建了 INSTEAD OF 触发器,但它告诉我“无法在表上创建 INSTEAD OF 触发器”。我还尝试将触发器更改为 BEFORE 和 AFTER,当我检查添加新行时 Orders 表是否更新时,它没有更新。太令人沮丧了!
  • 为什么这个视图会具体化?查询一个对一个表执行查找并且只对这个表执行查找的视图,效率并不比直接查询该表低。

标签: sql oracle ora-00904


【解决方案1】:

Oracle 可以看到您的表结构。我们不能。我打赌 Oracle 会在您的代码中看到问题。

它应该指向错误的第一行。如果不是,则从 user_errors 中选择 *;

也许您的 ORDERS 表没有 SHIP_DATE(因为第一条语句谈到了 EXPECTED_SHIP_DATE)。

【讨论】:

  • 我创建了实体化视图,当我尝试创建 INSTEAD OF 触发器时,它显示:“无法在表上创建 INSTEAD OF 触发器”。这很奇怪。
【解决方案2】:

不是甲骨文的人,但你不应该使用

:OLD.SHIP_DATE

:NEW.SHIP_DATE

:OLD.ORDER_DATE

:NEW.ORDER_DATE

参考:Oracle's trigger doc

【讨论】:

    【解决方案3】:

    对不起,为什么不在订单表上创建 o BEFORE INSERT 触发器?创建 BEFORE INSERT 触发器时,如果在订单表中添加新行,可以使用 .NEW.EXPECTED_SHIP_DATE,.NEW.EXPECTED_RECEIVE_DATE 更新订单表。不要在订单上创建物化视图

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多