<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # CREATE TRIGGER ## Name CREATE TRIGGER?--?定義一個新觸發器 ## Synopsis ``` CREATE [ CONSTRAINT ] TRIGGER _name_ { BEFORE | AFTER | INSTEAD OF } { _event_ [ OR ... ] } ON _table_name_ [ FROM _referenced_table_name_ ] { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } } [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN ( _condition_ ) ] EXECUTE PROCEDURE _function_name_ ( _arguments_ ) where `_event_` can be one of: INSERT UPDATE [ OF _column_name_ [, ... ] ] DELETE TRUNCATE ``` ## 描述 `CREATE TRIGGER`創建一個新的觸發器。 觸發器將與指定表或視圖關聯并且將在特定事件發生時執行聲明的 `_function_name_`函數。 觸發器可以聲明為在對記錄進行操作之前(在檢查約束之前和`INSERT`、 `UPDATE`、`DELETE`執行前); 或操作完成之后(在檢查約束之后和完成`INSERT`、 `UPDATE`、`UPDATE`操作);或取代操作 (在視圖上插入、更新或刪除)觸發。如果觸發器在事件之前或者取代事件, 觸發器可能略過當前記錄的操作或改變被插入的記錄(只對`UPDATE` 和`UPDATE`操作有效)。如果觸發器在事件之后, 所有更改,包括其他觸發器的影響,對觸發器都是"可見"的。 一個被標記為`FOR EACH ROW`的觸發器為操作修改的每一行都調用一次。 比如,一個影響 10 行的`DELETE`將導致任何在目標關系上的 `ON DELETE`觸發器獨立調用 10 次,每個被刪除的行調用一次。 相比之下,一個被標記為`FOR EACH STATEMENT`的觸發器只執行一次, 而不管有多少行被修改。(特別是,一個修改零行的操作仍然會導致合適的 `FOR EACH STATEMENT`觸發器被執行。 指定為觸發`INSTEAD OF`觸發器事件的觸發器必須被標記為 `FOR EACH ROW`,并且只能在視圖上定義。視圖上的`BEFORE` 和`AFTER`觸發器必須被標記為`FOR EACH STATEMENT`。 另外,觸發器可能被定義為為`TRUNCATE`觸發, 盡管只有`FOR EACH STATEMENT`。 下面表總結中的觸發器類型可能被用在表和視圖上: | 何時 | 事件 | 行級別 | 語句級別 | | --- | --- | --- | --- | | `BEFORE` | `INSERT`/`UPDATE`/`DELETE` | 表 | 表和視圖 | | `TRUNCATE` | — | 表 | | `AFTER` | `INSERT`/`UPDATE`/`DELETE` | 表 | 表和視圖 | | `TRUNCATE` | — | 表 | | `INSTEAD OF` | `INSERT`/`UPDATE`/`DELETE` | 視圖 | — | | `TRUNCATE` | — | — | 還有,觸發器定義可以聲明一個布爾`WHEN`條件,用來測試觸發器是否應該被觸發。 在行級別觸發器中,`WHEN`條件可以檢測該行的字段的舊的和/或新值。 語句級別的觸發器也可以擁有`WHEN`條件,盡管該特性對于它們來說不太有用, 因為該條件不能引用表中的任何值。 如果多個同類型的觸發器為同一事件做了定義,那么它們將按照字母順序被觸發。 當聲明了`CONSTRAINT`選項時,這個命令創建一個_約束觸發器_。 作為正規觸發器也是相同的,除了觸發器觸發的時間可以使用[SET CONSTRAINTS](#calibre_link-85) 調整。約束觸發器必須是`AFTER ROW`觸發器。 它們可以在導致觸發事件的語句的結束觸發,也可以在包含的事務的結束觸發; 在后面一種情況下,它們被稱為_延遲的_。 一個等待延遲的觸發器觸發也可以通過使用`SET CONSTRAINTS`強制立即發生。 當它們實現的約束非法時,約束觸發器預計會引發一個異常。 `SELECT`并不更改任何行,因此你不能創建 `SELECT`觸發器。這種場合下規則和視圖更合適些。 請參考[Chapter 36](#calibre_link-460)獲取更多觸發器信息。 ## 參數 `_name_` 賦予新觸發器的名稱。它必需和任何作用于同一表的觸發器不同。 該名字不能是模式修飾的—觸發器繼承它的表的模式。 對于約束觸發器,當使用`SET CONSTRAINTS`修改觸發器的行為時, 這也是要使用的名字。 `BEFORE``AFTER` `INSTEAD OF` 決定該函數是在事件之前、之后還是取代事件時調用。 約束觸發器只能被聲明為`AFTER`。 `_event_` `INSERT`、`UPDATE`、`DELETE` 或`TRUNCATE`之一。它聲明激發觸發器的事件。 多個事件可以用`OR`聲明。 對于`UPDATE`事件,使用這個語法聲明一個字段列表是可能的: ``` UPDATE OF _column_name1_ [, _column_name2_ ... ] ``` 該觸發器將只在至少一個列表中的字段在`UPDATE`命令的目標中提及時觸發。 `INSTEAD OF UPDATE`事件不支持字段的列表。 `_table_name_` 觸發器作用的表或視圖的名稱(可以有模式修飾) `_referenced_table_name_` 約束引用的另外一個表的名字(可以有模式修飾)。這個選項用于外鍵約束, 不推薦用于一般用途。只能為約束觸發器指定。 `DEFERRABLE` `NOT DEFERRABLE` `INITIALLY IMMEDIATE` `INITIALLY DEFERRED` 觸發器的默認時機。參閱[CREATE TABLE](#calibre_link-7)文檔獲取這些約束選項的詳細信息。 只能為約束觸發器指定。 `FOR EACH ROW` `FOR EACH STATEMENT` 這些選項聲明觸發器過程是否為觸發器事件影響的每個行觸發一次, 還是只為每條 SQL 語句觸發一次。如果都沒有聲明, 那么`FOR EACH STATEMENT`將是缺省。 約束觸發器只能聲明為`FOR EACH ROW`。 `_condition_` 一個決定觸發器函數實際上是否執行的布爾表達式。如果聲明了`WHEN`, 那么該函數只有`_condition_` 返回`true`時被調用。在`FOR EACH ROW`觸發器中, `WHEN`條件可以通過分別寫`OLD.``_column_name_`或`NEW.``_column_name_`參考字段的舊的和/或新的行值。 當然,`INSERT`觸發器不能參考`OLD`, `OLD`觸發器不能參考`NEW`。 `INSTEAD OF`觸發器不支持`WHEN`條件。 目前,`WHEN`表達式不能包含子查詢。 請注意,對于約束觸發器,`WHEN`條件的計算是不延遲的, 只是在行更新操作執行之后立即發生。如果該條件計算不為真, 那么觸發器就不排隊延遲執行。 `_function_name_` 一個用戶提供的函數,它聲明為不接受參數并且返回`trigger`類型, 該函數將在觸發器被觸發時調用。 `_arguments_` 一個可選的用逗號分隔的參數列表,它將在觸發器執行的時候提供給函數。 這些參數是文本字符串常量。也可以在這里寫簡單的名字和數值常量, 但是它們會被轉換成字符串。請檢查該觸發器函數的實現語言的描述, 找出如何在該函數中訪問這些參數;這些參數可能和普通的函數參數不同。 ## 注意 要在表上創建一個觸發器,用戶必需在該表上有`TRIGGER`權限。 用戶也必須在觸發器函數上有`EXECUTE`權限。 使用[DROP TRIGGER](#calibre_link-461)刪除觸發器。 字段特有的觸發器(使用`UPDATE OF` `_column_name_` 定義的)將在它的任意字段作為目標列出在`UPDATE`命令的`SET` 列表中時觸發。當觸發器沒有觸發時,字段的值也是有可能改變的,因為通過 `BEFORE UPDATE`觸發器做的行內容的改變是不考慮的。相反的, 命令如`UPDATE ... SET x = x ...`將觸發在字段`x` 上的觸發器,盡管字段的值沒有改變。 在`BEFORE`觸發器中,`WHEN`條件只在函數被或將被執行之前計算, 所以使用`WHEN`與在觸發器函數的開始測試相同的條件并無實質區別。 要特別的注意,條件看到的`NEW`行是當前的值,可能被早些的觸發器修改了。 另外,`BEFORE`觸發器的`WHEN`條件不允許檢測`NEW` 行的系統字段(比如`oid`),因為那些目前還沒有設置。 在`AFTER`觸發器中,`WHEN`條件只在行更新發生之后計算, 并且它決定一個事件是否在語句的最后排隊觸發該觸發器。所以當`AFTER` 觸發器的`WHEN`條件沒有返回真時,不需要排隊一個事件, 也不需要在語句的最后重新抓取行。如果觸發器只需要為少量的行觸發, 這會導致修改許多行的語句明顯的加速。 在PostgreSQL 7.3以前, 必須把觸發器函數聲明為返回`opaque`占位類型,而不是`trigger`類型。 為了支持加載老的轉儲文件,`CREATE TRIGGER`將接受一個聲明為返回 `opaque`的函數,但是它將發出一條 NOTICE 并且把函數聲明的返回類型改成 `trigger`。 ## 例子 當表`accounts`的一行要被更新時,執行函數 `check_account_update` : ``` CREATE TRIGGER check_update BEFORE UPDATE ON accounts FOR EACH ROW EXECUTE PROCEDURE check_account_update(); ``` 同樣的,但是只在字段`balance`在`UPDATE` 命令的目標中指定時執行該函數: ``` CREATE TRIGGER check_update BEFORE UPDATE OF balance ON accounts FOR EACH ROW EXECUTE PROCEDURE check_account_update(); ``` 這種形式只在字段`balance`實際上改變了值時執行該函數: ``` CREATE TRIGGER check_update BEFORE UPDATE ON accounts FOR EACH ROW WHEN (OLD.balance IS DISTINCT FROM NEW.balance) EXECUTE PROCEDURE check_account_update(); ``` 只在改變了什么東西時,調用函數記錄`accounts`的更新: ``` CREATE TRIGGER log_update AFTER UPDATE ON accounts FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) EXECUTE PROCEDURE log_account_update(); ``` 為每一行執行函數`view_insert_row`以在一個視圖下插入行到表: ``` CREATE TRIGGER view_insert INSTEAD OF INSERT ON my_view FOR EACH ROW EXECUTE PROCEDURE view_insert_row(); ``` [Section 36.4](#calibre_link-462)包含一個完整的用C寫的觸發器函數的例子。 ## 兼容性 PostgreSQL里的`CREATE TRIGGER` 語句實現了一個SQL標準的子集。目前仍然缺少下面的功能: * SQL 允許你為"old"和"new"行或者表定義別名, 用于定義觸發器的動作(也就是`CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...`)。 因為PostgreSQL 允許觸發器過程以任意數量的用戶定義語言進行書寫, 所以訪問數據的工作是用和語言相關的方法實現的。 * PostgreSQL不允許舊的和新的表在語句級別的觸發器中引用, 也就是,包含所有舊的和/或新的行的表,在SQL標準中被`OLD TABLE` 和`NEW TABLE`子句提及。 * PostgreSQL只允許為觸發的動作執行用戶定義的函數。 SQL 標準允許執行一些其它的命令,比如拿`CREATE TABLE` 作為觸發器動作。這個限止并不難繞開,只要創建一個執行這些命令的用戶定義的函數即可。 SQL 要求多個觸發器應該以創建的時間順序執行。 PostgreSQL采用的是按照名字順序,并認為這樣更加方便。 SQL 要求必須在級聯`DELETE`完成_之后_再觸發級聯刪除上的 `BEFORE DELETE`觸發器。PostgreSQL 的行為是`BEFORE DELETE`將永遠在刪除動作之前觸發, 即使對于級聯刪除也是如此,我們認為這樣更一致。如果`BEFORE` 觸發器在由引用操作引起的更新期間修改行或阻止更新,仍然存在不標準的行為。 這將導致違反約束或者存儲不符合參照完整性的數據。 用`OR`給一個觸發器聲明多個動作是 PostgreSQL對SQL標準的擴展。 觸發觸發器`TRUNCATE`的能力是一個 PostgreSQL對SQL標準的擴展,就像在視圖上定義語句級別觸發器的能力。 `CREATE CONSTRAINT TRIGGER`是一個 PostgreSQL對SQL標準的擴展。 ## 又見 [ALTER TRIGGER](#calibre_link-463), [DROP TRIGGER](#calibre_link-461), [CREATE FUNCTION](#calibre_link-4), [SET CONSTRAINTS](#calibre_link-85)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看