2014-07-18 32 views
1

在文檔和在線搜索中存在對語句和行級觸發器的支持的混淆。根據我見過的文檔,Firebird的最新版本支持聲明和行級觸發器。Firebird「For Each Row」觸發語法

Firebird應該支持SQL-92/99。標準的方法是在觸發器SQL中使用「for each row」,但是,這會導致firebird出現錯誤。

這裏是我的語句級觸發器,它的工作原理:

CREATE TRIGGER myExampleTrigger FOR myTable 
    AFTER UPDATE 
    AS 
    BEGIN 
     POST_EVENT 'testEvent'; 
    END; 

這裏是我的行級觸發器,它不工作:

CREATE TRIGGER myExampleTrigger FOR myTable 
    AFTER UPDATE 
    AS 
    FOR EACH ROW 
    BEGIN 
     POST_EVENT 'testEvent'; 
    END; 

的語句級觸發器工作發佈一個myTable上的更新事件。當我更新多行時,它只會發佈一個事件。

觸發語句讓它做一個行級觸發器的語法是什麼,以便我可以發佈一個事件FOR EACH ROW更新?

回答

4

Firebird沒有聲明級觸發器。只要創建它作爲第一個。這是一個行級觸發器。

你說它只發佈一個事件。看來你也不明白火鳥事件是如何工作的。它會被張貼一次,但你可以看到事件計數器有多少次。它們在提交時發佈。

+0

感謝您使用event_counter的指針。我瀏覽過所有的文檔,但仍然找不到將其包含在觸發器中的語法。我發現了一些關於在存儲過程中使用event_count的例子,但不是觸發器。你知道語法嗎? – mpearso3

+0

計數器由事件回調檢索。這有點小技巧,但你肯定會找到一些例子。 –

+0

@ mpearso3爲什麼你需要觸發器中的事件計數器:只需發佈事件。只有註冊了事件通知的人才有興趣。 –

2

Firebird中的觸發器總是行級別,從來沒有語句級別。文檔(Interbase 6.0語言參考,第82頁;可從Firebird website獲得)說:

CREATE TRIGGER定義了數據庫的新觸發器。觸發器是一個獨立的 程序與表或視圖相關聯,當表或視圖中的 行被插入,更新或刪除時,該程序自動執行動作

正如Adriano已經解釋的,事件是在事務提交時發送的。如果您在單個交易中多次發佈相同的活動,則只會發佈一個活動(包含活動中的計數)。

事件用於向其他應用程序發出信號,而不是向數據庫本身發出信號(這就是觸發器本身的作用),所以 - afaik--不能註冊,也不能從觸發器中確定事件計數或存儲程序。應用程序註冊事件。這是如何完成取決於編程語言和驅動程序。

許多(舊)Interbase文檔顯示使用EVENT INITEVENT WAIT的示例,但這僅適用於需要預處理器且實際上很難使用的嵌入式SQL。使用Java和Jaybird,您可以使用FBEventManager來收聽活動,使用C#和Firebird.net提供程序可以使用FbRemoteEvent。如果您使用Firebird C API,則需要使用isc_que_events

+0

感謝您的信息。在firebird文檔中,我在存儲過程中發現了event_count:CREATE PROCEDURE send_times(event_count integer) AS DECLARE VARIABLE nr INTEGER; BEGIN nr = 1; WHILE(nr mpearso3

+0

@ mpearso3你可以鏈接到該文檔嗎? –

+0

至於行級別與語句級別的觸發器,我的理解是,如果行級別是一次多次更新/插入到您註冊的表中,將會觸發:[row-level vs statement-level]( http://stackoverflow.com/questions/10167346/row-level-trigger-vs-statement-level-trigger)。如果firebird是行級別的,那麼即使我更新多行,爲什麼它只觸發一次觸發器? – mpearso3