Oracle,触发器来控制表之间的链接

时间:2016-07-05 13:32:10

标签: oracle triggers

我需要创建一个触发器来控制表之间的链接。我有以下表格结构(下图)。项目与预算和结构相关联,此结构应链接到相同的预算。 有时,该项目收到错误的结构,接收与其自己的预算预算不同的结构。我需要在插入预算项目或编辑要验证的预算项目时如果id_budget相等,则dg_budget_item的id_budget等于与其链接的id_budget dg_budget_structure

enter image description here

我开始构建此触发器,但不知道如何继续

CREATE TRIGGER T_BUDGETO_STRUCTURE_ITEM_ID_STRUCTURE
  BEFORE INSERT OR UPDATE OF id_budget_structure ON dg_budget_structure_item
  select id_budget from dg_budget_structure where id_budget_structure = new.id_budget_structure      
  FOR EACH ROW
     WHEN (new.id_budget <> ???(result of select?))
  pl/sql_block

1 个答案:

答案 0 :(得分:1)

这可以让你接近你想要的东西

CREATE OR REPLACE TRIGGER T_BUDGET_STRUCTURE_ITEM_ID_STRUCTURE
   BEFORE INSERT OR UPDATE OF id_budget_structure ON dg_budget_item
   FOR EACH ROW
DECLARE
   v_id_budget_structure   NUMBER;
   Budgets_do_not_match    EXCEPTION;
   v_code                  NUMBER;
   v_errm                  VARCHAR2(64);
BEGIN
   SELECT id_budget INTO v_id_budget_structure FROM dg_budget_structure WHERE id_budget_structure = :new.id_budget_structure      
   IF :new.id_budget <> v_id_budget_structure THEN
      RAISE Budgets_do_not_match;
   END IF;
EXCEPTION
   WHEN Budgets_do_not_match THEN
      Raise_application_error (-20001,
         'Budget '||TO_CHAR(:new.id_budget)||' for structure '
         || :new.id_budget_structure || 'does not match the budget trying to be linked';
   WHEN NO_DATA_FOUND THEN
      Raise_application_error(-20002,
         'Invalid budget structure ' ||:new.id_budget_structure);
   WHEN OTHERS THEN
      v_code := SQLCODE;
      v_errm := SUBSTR(SQLERRM, 1 , 64);
      Raise_application_error(-20000,
         'Unexpected error ' || v_code  ': ' || v_errm;
END;

你不能在触发器中ROLLBACK,因此你的应用程序需要处理它。