Trigger
DB2:不能在觸發器定義中使用 RUNSTATS/REORG?
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 之前更新統計數據有什麼意義?