簡體   English   中英

刪除觸發器未插入記錄后的PL SQL

[英]PL SQL After Delete Trigger Not Inserting Record

我有一個用PL / SQL編寫的觸發器,該觸發器應該將已刪除的記錄插入到另一個表中。

這是觸發器:

CREATE OR REPLACE TRIGGER keepRemoved
AFTER DELETE
ON schema.table
FOR EACH ROW
DECLARE selection_id varchar2(10) := NULL;
BEGIN
    /* Check if deleted record already exists in destination table by populating variable with that value. */
     BEGIN
       SELECT a.primary_key
       INTO selection_id
       FROM [destinationTable] a
       WHERE a.primary_key = :old.removed_key
         AND a.condition_value = true
         AND a.condition_value2 = 42;
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           selection_id := NULL;
         WHEN OTHERS THEN
           selection_id := NULL;
      END;

    /* If selection_id is null, meaning that value doesn't exist in the destination table, insert deleted record in destination table */
      IF selection_id IS NULL THEN
        INSERT INTO [destinationTable] a
           (a.primary_key,
            a.user_id,
            a.column2,
            ...
            a.columnN)
        VALUES
            (:old.removed_key,
             SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY'),
              123,
              ...
              'MoreText')
       END IF;
       EXCEPTION
         WHEN OTHERS THEN NULL;
 END;

問題在於,刪除記錄后, destinationTable不會填充任何內容。

對於上下文,我永遠不會成為刪除記錄的用戶。

您在此處輸入的內容就像是偽代碼,不是真正的代碼,因此我無能為力,但是這是我的建議:

  1. 你有錯誤嗎? 然后按照錯誤添加調試信息,然后向dbms_output.put_line寫入一些異常代碼以進行檢查。

  2. 確保觸發器與執行DML操作的表相同。

  3. 更改觸發器以使用“刪除前”。

  4. 檢查目標表中是否存在a.primary_key,否則將不執行插入。

您好,請以其他方式更改邏輯,例如以下使用計數而不是值和空匹配。 同樣,您也不需要計數例外處理。

CREATE OR REPLACE TRIGGER keepRemoved
AFTER DELETE
ON schema.table
FOR EACH ROW
DECLARE 
selection_count pls_integer:=0
BEGIN
    /* Check if deleted record already exists in destination table by populating variable with that value. */
     BEGIN
       SELECT count(*)
       INTO selection_count
       FROM [destinationTable] a
       WHERE a.primary_key = :old.removed_key
         AND a.condition_value = true
         AND a.condition_value2 = 42;
       EXCEPTION     -- can remove this.
         WHEN NO_DATA_FOUND THEN
           selection_count := 0;
         WHEN OTHERS THEN
           selection_count := 1;  
      END;

    /* If selection_id is null, meaning that value doesn't exist in the destination table, insert deleted record in destination table */
      IF selection_count = 0 THEN
        INSERT INTO [destinationTable] a
           (a.primary_key,
            a.user_id,
            a.column2,
            ...
            a.columnN)
        VALUES
            (:old.removed_key,
             SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY'),
              123,
              ...
              'MoreText')
       END IF;
       EXCEPTION
         WHEN OTHERS THEN NULL;
 END; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM