如果使用一个表主键到另一表外键,触发器将如何工作

问题描述 投票:0回答:1

我有两个数据库。一种是远程数据库,另一种是本地数据库。两者都有三张桌子。我已经为订单表创建了一个触发器,当远程数据库发生任何更改时,该触发器将更新/删除。我需要为其他两个表 ORd_detail 和 Releases 创建触发器。但我想通过在订单表中使用 orderno 来更新值。当两个数据库的 orderno 匹配时,如何修改查询以进行验证。

  1. 订单 --> ID(PK) 和 OrderNo
  2. Ord_Detail--> Ord_detail_ID(PK),ordersid(来自订单表的FK)
  3. 发布--> Releases_id(PK), Ord_detail_ID(来自 ord_detail 的 FK)

我已经为订单表创建了一个触发器。

CREATE OR REPLACE TRIGGER trg_order_locals
AFTER UPDATE OR DELETE ON ORDERS
FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN
  -- Update or delete the corresponding row in the remote database
  IF UPDATING THEN
    UPDATE ORDERS@local_link
    SET ID = :NEW.ID, ORDERNO = :NEW.ORDERNO, PONO = :NEW.PONO, ARCUSTO_ID = :NEW.ARCUSTO_ID, ORD_DATE = :NEW.ORD_DATE, ORD_BY = :NEW.ORD_BY, USERID = :NEW.USERID, DATE_TAKEN = :NEW.DATE_TAKEN, BILL_TO_ID = :NEW.BILL_TO_ID, SHIP_TO_ID = :NEW.SHIP_TO_ID, CUSER1 = :NEW.CUSER2, CUSER3 = :NEW.CUSER3, CUSER5 = :NEW.CUSER5, CUSER6 = :NEW.CUSER6, TIMESTAMP = :NEW.TIMESTAMP, FOB = :NEW.FOB, CHANGEUSER_ID = :NEW.CHANGEUSER_ID, TERMS_ID = :NEW.TERMS_ID, FREIGHT_ID = :NEW.FREIGHT_ID, FREE_FORM = :NEW.FREE_FORM, DISCOUNT = :NEW.DISCOUNT, CONTACT_ID = :NEW.CONTACT_ID, ECODE = :NEW.ECODE, EID = :NEW.EID, EDATE_TIME = :NEW.EDATE_TIME, ECOPY = :NEW.ECOPY, CURRENCY_ID = :NEW.CURRENCY_ID, TYPE = :NEW.TYPE, REV = :NEW.REV, OE_CONTROL = :NEW.OE_CONTROL, EPLANT_ID = :NEW.EPLANT_ID, EDI_855_CREATED = :NEW.EDI_855_CREATED, PRINT_COUNT = :NEW.PRINT_COUNT, PRINT_LAST_USER = :NEW.PRINT_LAST_USER, PRINT_LAST_DATE = :NEW.PRINT_LAST_DATE, WEB_ORDERS_ID = :NEW.WEB_ORDERS_ID, EDI_CHANGE_DATE = :NEW.EDI_CHANGE_DATE, WEB_CHANGE_DATE = :NEW.WEB_CHANGE_DATE, AGGREGATE_CALCULATED = :NEW.AGGREGATE_CALCULATED, INTER_CONSIGN = :NEW.INTER_CONSIGN, ARCUSTO_CREDIT_CARD_ID = :NEW.ARCUSTO_CREDIT_CARD_ID, DIVISION_ID = :NEW.DIVISION_ID, CUSER4 = :NEW.CUSER4, CRM_QUOTE_ID = :NEW.CRM_QUOTE_ID, ALT_DIVISION_ID = :NEW.ALT_DIVISION_ID, COMMENT1 = :NEW.COMMENT1, PAYMENT_TYPE = :NEW.PAYMENT_TYPE, EXT_COMMENT1 = :NEW.EXT_COMMENT1, ORD_LINE_DATE = :NEW.ORD_LINE_DATE, FREIGHT_CHARGE = :NEW.FREIGHT_CHARGE, FREIGHT_QUOTENO = :NEW.FREIGHT_QUOTENO, APPLY_FREIGHT_BOL_TO_PS = :NEW.APPLY_FREIGHT_BOL_TO_PS, CONTACT_ID2 = :NEW.CONTACT_ID2, CAMPAIGN_ID = :NEW.CAMPAIGN_ID, CRM_OPPORTUNITY_ID = :NEW.CRM_OPPORTUNITY_ID, FOB_THIRD_PARTY_ID = :NEW.FOB_THIRD_PARTY_ID, EDI_865_CREATED = :NEW.EDI_865_CREATED, DROP_SHIP_PO_ID = :NEW.DROP_SHIP_PO_ID, APPROVED = :NEW.APPROVED, APPROVAL_REQUIRED = :NEW.APPROVAL_REQUIRED, FREIGHT_ACCOUNT_NUMBER = :NEW.FREIGHT_ACCOUNT_NUMBER, IS_DRAFT = :NEW.IS_DRAFT, IS_MANUAL_OUTSOURCE = :NEW.IS_MANUAL_OUTSOURCE, IS_QUICK_ORDER = :NEW.IS_QUICK_ORDER, TAX_CALCULATED = :NEW.TAX_CALCULATED, SHIP_COMPLETE = :NEW.SHIP_COMPLETE, ACCRUED_FREIGHT = :NEW.ACCRUED_FREIGHT, ICT_MANUAL_SHIP_TO_ID = :NEW.ICT_MANUAL_SHIP_TO_ID, SO_DISCOUNT_TYPE_ID = :NEW.SO_DISCOUNT_TYPE_ID, SO_DISCOUNT_TYPE_TOTAL_AMOUNT = :NEW.SO_DISCOUNT_TYPE_TOTAL_AMOUNT, SO_DISCOUNT_TYPE_PERCENT = :NEW.SO_DISCOUNT_TYPE_PERCENT, STATUS = :NEW.STATUS, PALLET_CHARGE = :NEW.PALLET_CHARGE, PALLET_CHARGE_SOURCE = :NEW.PALLET_CHARGE_SOURCE, USE_PALLET_CHARGE = :NEW.USE_PALLET_CHARGE, DIST_ROUTING_RULES_ID = :NEW.DIST_ROUTING_RULES_ID, DS_SOURCE = :NEW.DS_SOURCE
    WHERE ID = :OLD.ID AND ORDERNO = :OLD.ORDERNO;

  ELSIF DELETING THEN
    DELETE FROM ORDERS@local_link
    WHERE ID = :OLD.ID AND ORDERNO = :OLD.ORDERNO;

  END IF;
  commit;
END;
/

CREATE OR REPLACE TRIGGER trg_orddetail_locals
AFTER UPDATE OR DELETE ON ORD_DETAIL
FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN
  -- Update or delete the corresponding row in the remote database
  IF UPDATING THEN
    UPDATE ORD_DETAIL@local_link dst
    SET ID = :NEW.ID, ORDERS_ID = :NEW.ORDERS_ID, ARINVT_ID = :NEW.ARINVT_ID, ORD_DET_SEQNO = :NEW.ORD_DET_SEQNO, TOTAL_QTY_ORD = :NEW.TOTAL_QTY_ORD, CUMM_SHIPPED = :NEW.CUMM_SHIPPED, ONHOLD = :NEW.ONHOLD, TAX_CODE_ID = :NEW.TAX_CODE_ID, MISC_ITEM = :NEW.MISC_ITEM, COMMENT1 = :NEW.COMMENT1, UNIT_PRICE = :NEW.UNIT_PRICE, SALESPEOPLE_ID = :NEW.SALESPEOPLE_ID, COMM_PCT = :NEW.COMM_PCT, PRICE_PER_1000 = :NEW.PRICE_PER_1000, LIST_UNIT_PRICE = :NEW.LIST_UNIT_PRICE, DISCOUNT = :NEW.DISCOUNT, ECODE = :NEW.ECODE, EID = :NEW.EID, EDATE_TIME = :NEW.EDATE_TIME, ECOPY = :NEW.ECOPY, EPLANT_ID = :NEW.EPLANT_ID, COST_OBJECT_ID = :NEW.COST_OBJECT_ID, COST_OBJECT_SOURCE = :NEW.COST_OBJECT_SOURCE, UNIT = :NEW.UNIT, UOM_FACTOR = :NEW.UOM_FACTOR, GLACCT_ID = :NEW.GLACCT_ID, DOCKID = :NEW.DOCKID, LINEFEED = :NEW.LINEFEED, RESERVELOCATION = :NEW.RESERVELOCATION, KBTRIGGER = :NEW.KBTRIGGER, AGGREGATE_DISCOUNT = :NEW.AGGREGATE_DISCOUNT, CUST_CUM_START = :NEW.CUST_CUM_START, LAST_RECEIPT_QTY = :NEW.LAST_RECEIPT_QTY, LAST_RECEIPT_DATE = :NEW.LAST_RECEIPT_DATE, RMA_DETAIL_ID = :NEW.RMA_DETAIL_ID, REF_CODE_ID = :NEW.REF_CODE_ID, FAB_QTY = :NEW.FAB_QTY, RAW_MT_QTY = :NEW.RAW_MT_QTY, FAB_START_DATE = :NEW.FAB_START_DATE, FAB_END_DATE = :NEW.FAB_END_DATE, CONTAINERS = :NEW.CONTAINERS, FROM_SALES_OPTION = :NEW.FROM_SALES_OPTION, SHIP_TO_ID_FROM = :NEW.SHIP_TO_ID_FROM, IN_TRANSIT_WORKORDER_ID = :NEW.IN_TRANSIT_WORKORDER_ID, IN_TRANSIT_PARTNO_ID = :NEW.IN_TRANSIT_PARTNO_ID, IS_DROP_SHIP = :NEW.IS_DROP_SHIP, IS_MAKE_TO_ORDER = :NEW.IS_MAKE_TO_ORDER, MFG_QUAN = :NEW.MFG_QUAN, PO_INFO = :NEW.PO_INFO, MAKE_TO_ORDER_PS_TICKET_DTL_ID = :NEW.MAKE_TO_ORDER_PS_TICKET_DTL_ID, CAMPAIGN_ID = :NEW.CAMPAIGN_ID, CTP = :NEW.CTP, CRM_QUOTE_DETAIL_ID = :NEW.CRM_QUOTE_DETAIL_ID, SALES_OPTION_CHOICE_ID = :NEW.SALES_OPTION_CHOICE_ID, CUSER1 = :NEW.CUSER1, CUSER2 = :NEW.CUSER2, CUSER3 = :NEW.CUSER3, REBATE_PARAMS_ID = :NEW.REBATE_PARAMS_ID, PHANTOM_ORD_DETAIL_ID = :NEW.PHANTOM_ORD_DETAIL_ID, PHANTOM_PTSPER = :NEW.PHANTOM_PTSPER, HIDE = :NEW.HIDE, OUTSOURCE_PO_DETAIL_ID = :NEW.OUTSOURCE_PO_DETAIL_ID, LOT_CHARGE_ARINVT_ID = :NEW.LOT_CHARGE_ARINVT_ID, STANDARD_ID = :NEW.STANDARD_ID, DIVISION_ID = :NEW.DIVISION_ID, AKA_KIND = :NEW.AKA_KIND, MSDS_UPLOAD = :NEW.MSDS_UPLOAD, SHIPHOLD = :NEW.SHIPHOLD, MILK_RUN_LOCATIONS_ID = :NEW.MILK_RUN_LOCATIONS_ID, LOT_CHARGE_ORD_DETAIL_ID = :NEW.LOT_CHARGE_ORD_DETAIL_ID, AUTO_INVOICE = :NEW.AUTO_INVOICE, C_PO_MISC_ID = :NEW.C_PO_MISC_ID, MISC_ITEMNO = :NEW.MISC_ITEMNO, SAMPLE = :NEW.SAMPLE, PHANTOM_DTL_MODIFIED = :NEW.PHANTOM_DTL_MODIFIED, BOGO_ORD_DETAIL_ID = :NEW.BOGO_ORD_DETAIL_ID, BOGO_AR_DISCOUNT_TIERS_ID = :NEW.BOGO_AR_DISCOUNT_TIERS_ID, BOGO_EXCEPTION = :NEW.BOGO_EXCEPTION, PRICE_BOOK_ID = :NEW.PRICE_BOOK_ID, PRICE_BOOK_PRICE_TYPE_ID = :NEW.PRICE_BOOK_PRICE_TYPE_ID, NEW_SEQUENCE_COLUMN = :NEW.NEW_SEQUENCE_COLUMN
    WHERE dst.ID = :NEW.ID 
    OR dst.ORDERS_ID = (SELECT ORDERNO FROM ORDERS@local_link WHERE ID = :NEW.ORDERS_ID);
  ELSIF DELETING THEN
    DELETE FROM ORD_DETAIL@local_link
    WHERE ID = :OLD.ID AND ORDERS_ID = :OLD.ORDERS_ID;
  END IF;
END;
/

我已经为ord_detail创建了触发器。但不工作。请验证并更正代码

sql database oracle triggers primary-key
1个回答
0
投票

“不工作”是什么意思?

由于

TRG_ORDDETAIL_LOCALS
是一项自主交易,因此它需要
COMMIT
ROLLBACK
,而您两者都没有。


无论如何,我建议你考虑放弃这个模型并切换到其他模型,例如物化视图你会刷新例如

on commit

(刷新物化视图)

物化视图可以使用 ON COMMIT 方法自动刷新。因此,每当提交更新了定义了物化视图的表的事务时,这些更改都会自动反映在物化视图中。使用这种方法的优点是您永远不必记住刷新物化视图。 (...)

© www.soinside.com 2019 - 2024. All rights reserved.