0

我通过前面的答案创建了一个伪外键来引用 Netbeans 8.1 中两个数据库之间的表。这是我想出的代码,

DELIMITER //

CREATE OR REPLACE TRIGGER conf_track_FK
AFTER INSERT OR UPDATE on S26994437.track@FIT5148B
FOR EACH ROW
BEGIN
    IF EXISTS(select * from inserted I where not exists (select * from
    S1234567.conference@FIT5148A A where I.conf_id=A.conf_id))
    RAISE_APPLICATION_ERROR(-20001,'Violation of pseudo-foreign key.');
    ROLLBACK;
    END IF;
END;

/

但是,我遇到以下错误:

PLS-00103: Encountered the symbol ";" when expecting one of the following:
   ) with and or group having intersect minus start union where
   connect

PLS-00103: Encountered the symbol "ROLLBACK" when expecting one of the following:
   := . ( % ;
The symbol ":=" was substituted for "ROLLBACK" to continue.

PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   end not pragma final instantiable order overriding static
   member constructor map
4

2 回答 2

0

在 dbo.MyTable 上创建触发器 dbo.MyTableTrigger,插入后,更新为开始

如果不存在(从 OtherDB.dbo.TableName 中选择 PK,其中 PK 在(从插入中选择 FK)开始 - 在此处处理参考错误 END

结尾

于 2016-04-01T05:05:55.150 回答
0

试试下面的插图片段。希望能帮助到你。而且任何事务,如 COMMIT / ROLLBACK 都不能放在触发器内部,除非它是一个自治事务,但这也不是一个好主意,因为父事务对触发器事务是隐藏的。因此,即使父事务失败,自治事务也会完成。

CREATE OR REPLACE TRIGGER conf_track_FK AFTER
  INSERT OR
  UPDATE ON S26994437.track@FIT5148B --Remove DB link as it cant be used in Trigger
  FOR EACH ROW 
  DECLARE 
  lv_cnt PLS_INTEGER;
  BEGIN
    SELECT COUNT(1)
    INTO lv_cnt
    FROM inserted I
    WHERE NOT EXISTS
      (SELECT 1 FROM S1234567.conference@FIT5148A A WHERE I.conf_id=A.conf_id
      );
    IF lv_cnt > 0 THEN
      RAISE_APPLICATION_ERROR(-20001,'Violation of pseudo-foreign key.');
    END IF;
  END;
  /
于 2016-04-01T07:20:21.193 回答