我正在嘗試創建一個 Oracle 觸發器
CREATE OR REPLACE TRIGGER ACT_SESSION_AUDIT_TRIGGER
AFTER INSERT OR UPDATE
ON ACT_SESSION
FOR EACH ROW
DECLARE
BEGIN
if (:NEW.PROTOCOL='HTTP' or :NEW.PROTOCOL='SFTP') and :NEW.PRINCIPAL NOT IN ('AAA%', 'BBB%') then
INSERT INTO ACT_SESSION_AUDIT (PRINCIPAL,
CON_START_TIME,
DIS_END_TIME,
ADAPTER_NAME,
ADAPTER_TYPE,
PROTOCOL)
VALUES(:NEW.PRINCIPAL,
:NEW.CON_START_TIME,
:NEW.DIS_END_TIME,
:NEW.ADAPTER_NAME,
:NEW.ADAPTER_TYPE,
:NEW.PROTOCOL);
END if;
END;
但是,當PRINCIPAL以AAA開頭時,它會導致觸發器被呼叫。NOT IN使用部分字串的正確方法是什么?
uj5u.com熱心網友回復:
您需要LIKE在“AAA%”和“BBB%”中進行模式匹配。
IF :new.protocol IN ('HTTP', 'SFTP') AND
:new.principal NOT LIKE 'AAA%' AND
:new.principal NOT LIKE 'BBB%' THEN
...
順便說一句,您可以將其移至WHEN原因,以使這部分成為觸發器宣告的一部分:
CREATE OR REPLACE TRIGGER ACT_SESSION_AUDIT_TRIGGER
AFTER INSERT OR UPDATE
ON act_session
FOR EACH ROW
WHEN (new.protocol IN ('HTTP', 'SFTP') AND
new.principal NOT LIKE 'AAA%' AND
new.principal NOT LIKE 'BBB%')
BEGIN
理論上這更快,因為當不滿足條件時觸發器不會被呼叫。我不知道,如果這真的能有所作為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522697.html
