Trigger

DB2:不能在觸發器定義中使用 RUNSTATS/REORG?

  • December 2, 2013
CREATE TRIGGER MY_TRIG AFTER INSERT ON MY_TBL FOR EACH ROW
   BEGIN
       IF SOMECONDITION THEN
           DELETE FROM MY_TBL WHERE PK IN (SELECT PK FROM MY_TBL WHERE SOMEOTHERCONDITION FETCH FIRST 50 ROWS ONLY);
           RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL;
           REORG TABLE MY_TBL;
           RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL;
       END IF;
   END#

通過 DB2 9.4.7 的控制中心執行此操作(使用#終止字元),這給了我錯誤SQL0104N

An unexpected token "RUNSTATS" was found following "T 50 ROWS ONLY;
           ". Expected tokens may include: "COMMENT

我不理解為什麼。我是否不允許在觸發器定義中使用RUNSTATS/等命令?REORG單獨執行RUNSTATS命令就可以了。

——編輯——

關於我在這裡想要實現的更多資訊:有問題的表包含 BLOB 和其中的許多。為了限制此表使用的磁碟空間,我想對錶的大小進行限制。因此,我使用xxx_OBJECT_P_SIZE列中的資訊SYSIBMADM.ADMINTABINFO來確定表的目前大小,如果超出某些限制,我只需刪除表中最舊的 50 條記錄。在這種情況下我刪除的記錄越多,reorg/runstats 執行的頻率就越低。因此,不會為插入的每一行執行語句 -SOMECONDITION每次都會評估條件。

有沒有比使用觸發器更好的方法來實現這一點?

- - - 編輯 - - -

您只能在觸發器中使用 SQL 語句。RUNSTATS並且REORG不是 SQL 語句;它們是 DB2 CLP 命令,只有命令行處理器能理解它們。您可以嘗試使用系統儲存過程ADMIN_CMD()來呼叫這些實用程序,但是,1)由於實用程序的性質,它仍然可能無法工作,並且 2)即使它確實有效,這也不是一個好主意。

您的觸發器還有其他問題。例如,您不能FETCH FIRST在刪除語句中使用。在 REORG 之前更新統計數據有什麼意義?

引用自:https://dba.stackexchange.com/questions/54245