这里的问题是,我们使用一个名为ArcGIS的应用程序为我们的数据库创建一个上层管理层,当我们的用户使用ArcGIS在数据库中创建一个新对象时,它会向其中添加一个默认值(0)。主键,因此在创建第二个对象时,它会触发ORA错误以获得重复值。
所以我的想法是为我们的PK创建一个自动增量触发器,但是使用AFTER INSERT代替。 我在网上找不到任何关于这个特定情况的例子,只需将BEFORE切换到AFTER就会出现错误,说明你不能在事后使用NEW
我尝试的SQL代码(取自其他问题):
CREATE OR REPLACE TRIGGER "IMOVEL_TRIGGER"
after insert on IMOVEL
for each row
begin
select IMOVEL_SEQ.nextval into :NEW.GEOCODIGO_IMOVEL from dual;
end;
它不能是BEFORE INSERT触发器,因为应用程序会覆盖它
简化,我需要的是一个AFTER INSERT触发器,它将PK更新为序列.nextval,它不允许我使用:OLD或:NEW,所以我不确定必须做什么。 或者仅在创建后运行的更新触发器
这对我来说是一个非常新的领域,现在只需要学习SQL来解决这个问题
答案 0 :(得分:1)
您只能在BEFORE触发器中更改vendor
值。当你到达AFTER触发器时,该行已被插入,因此更改列为时已晚。
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7004.htm说:
对BEFORE触发器的限制
:NEW
触发器受以下限制:
您无法在视图或对象视图上指定
BEFORE
触发器。您可以写入
BEFORE
值,但不能写入:NEW
值。AFTER触发限制
:OLD
触发器受以下限制:
您无法在视图或对象视图上指定
AFTER
触发器。您无法写出
AFTER
或:OLD
值。
目前尚不清楚为什么要使用AFTER触发器为PK分配序列值。常见的解决方案是使用BEFORE触发器。
中的示例答案 1 :(得分:0)
CREATE SEQUENCE IMOVEL_TRIGGER_SEQ START WITH 1;
触发器定义:
CREATE OR REPLACE TRIGGER IMOVEL_TRIGGER
BEFORE INSERT ON IMOVEL
FOR EACH ROW
BEGIN
SELECT IMOVEL_TRIGGER_SEQ.NEXTVAL
INTO :new.GEOCODIGO_IMOVEL
FROM dual;
END;