2013-10-25 18 views
0

我正在編寫INSTEAD OF UPDATE觸發器,我想確定觸發觸發器的UPDATE語句的WHERE子句有哪些列。如何檢查觸發where子句中給出的內容?

例如,

比方說,我們有以下

table_name 
--COL1 
--COL2 
--COL3 
--COL4 

我想,表時進行更新 例如UPDATE table_name SET COL1=VAL1,COL2=VAL2 WHERE COL3=VAL3

能在我的觸發

CREATE or replace TRIGGER DEVICES_VIEW_TR 
    INSTEAD OF UPDATE ON DEVICES_VW 
    BEGIN 
    IF (COL3 has been given in the where clause) THEN 
     variable=getValueOf(COL3); 
    ELSEIF (COL4 has been given in the where clause) THEN 
     variable=getValueOf(COL4); 
    END IF; 
    END; 
/

說可以這樣做?

感謝

+1

這看起來不太好。而不是更改set子句中提到的col1和col2,你想更改where子句中提到的col3?這會非常混亂。無論如何,觸發器不能告訴你的發射聲明,因此沒有機會知道where子句。 –

+0

@ThorstenKettner我不想改變where子句中提到的COL3的值。我只想知道引發觸發器的更新語句是否包含where子句中的COL3或COL4。原因是因爲我想執行更新,where子句只包含主鍵列而不是將更新多個記錄的列。我希望現在很清楚。 – NikosDim

+1

好的,你的例子有點混亂。正如我所說,觸發器不會告訴你觸發語句。所以你不能告訴其他col3或col4是在where子句中。唯一的選擇是檢測影響多行的更新,並在出現異常情況時拋出異常。即使這樣做也不容易,因爲觸發器中沒有關於受影響行數的信息。在這裏尋找一種方法來確定受影響的行數:http://stackoverflow.com/questions/8770386/how-to-get-number-of-rows-affected-by-a-statement-when-inside-that -statements-t –

回答

0

您可以使用NEWOLD pseudorecords和運行值

if :NEW.COL3 <> :OLD.COL3 THEN ... 
+0

不是我在找什麼。無論如何感謝 – NikosDim

1

的對比您可以在觸發器使用UPDATING('column name')

-- in INSTEAD OF trigger body: 
IF updating('COL1') THEN 
    -- some operation 
END IF; 

檢查本作一個例子:Example of using UPDATING

+1

我已經知道這一點,但這只是在檢查更新權限的SET部分傳遞什麼?所以這不是我正在尋找 – NikosDim

+0

@NikosDim等待,你想獲得哪些列在'WHERE'類中的信息?我不認爲這是可能的。抱歉,我沒有從你的描述中瞭解你的意圖。 –

0

觸發器不知道調用它們的語句的任何內容,因此您必須使用某種帶外信號。更改您的應用程序以在數據庫包中設置一些全局變量,或使用應用程序上下文。