<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 36.1\. 觸發器行為概述 一個觸發器是一種聲明,告訴數據庫應該在執行特定的操作的時候執行特定的函數。 觸發器可以附加到表和視圖上。 觸發器可以定義在一個`INSERT`, `UPDATE`, or `DELETE`命令之前或者之后執行, 要么是對每行執行一次,要么是對每條SQL語句執行一次。 如果某列在`UPDATE` 語句的`SET`子句中被提及,則`UPDATE`觸發器再次被觸發。 觸發器可以為`TRUNCATE`語句觸發。 如果發生觸發器事件,那么將在合適的時刻調用觸發器函數以處理該事件。 在視圖上,觸發器可以被定義執行而不是`INSERT`, `UPDATE`或者 `DELETE`操作。為了需要在視圖中修改的每一行觸發`INSTEAD OF`觸發器。 這是觸發器函數在基表下執行必要修改的責任,并且在適當情況下,返回在視圖中出現的修改的行。 在執行每個SQL語句, `INSERT`, `UPDATE`或者`DELETE` 操作之前或之后也可以定義視圖上的觸發器。 觸發器函數必須在創建觸發器之前,作為一個沒有參數并且返回`trigger`類型的函數定義。 觸發器函數通過特殊的`TriggerData`結構接收其輸入, 而不是用普通的函數參數方式。 一旦創建了一個合適的觸發器函數, 就可以用[CREATE TRIGGER](#calibre_link-459)創建觸發器。 同一個觸發器函數可以用于多個觸發器。 PostgreSQL提供_按行_與_按語句_觸發的觸發器。 按行觸發的觸發器函數為觸發語句影響的每一行執行一次;相比之下, 按語句觸發的觸發器函數為每條觸發語句執行一次,而不管影響的行數。 特別是,一個影響零行的語句將仍然導致按語句觸發的觸發器執行。 這兩種類型的觸發器有時候分別叫做_行級_觸發器和_語句級_觸發器。 在`TRUNCATE`上的觸發器可能只能在語句級別定義。 觸發之前或之后的視圖,觸發器只能在語句級別定義, 然而非`INSERT`, `UPDATE`或者 `DELETE`觸發的觸發器在行級別定義。 觸發器通常按照觸發的_before_和_after_, 或者_instead of_操作進行分類。 這些分別被稱為`BEFORE`觸發器,`AFTER`觸發器, `INSTEAD OF`觸發器。 語句級別的`BEFORE`觸發器通常在語句開始做任何事情之前觸發, 而語句級別的`AFTER`觸發器在語句結束時觸發。 觸發器的這些類型可以在表或者視圖上定義。 行級別的`BEFORE`觸發器在對特定行進行操作之前觸發, 而行級別的`AFTER`觸發器在語句結束的時候觸發 (但是在任何語句級別的`AFTER`觸發器之前)。 觸發器的這些類型可能只在表上定義。 行級別`INSTEAD OF`觸發器可能只在視圖上定義, 并且立刻觸發作為視圖上的每一行被標識為需要的操作。 按語句觸發的觸發器應該總是返回`NULL`。 如果必要,按行觸發的觸發器函數可以給調用它的執行者返回一行數據 (一個類型為`HeapTuple`的數值), 那些在操作之前觸發的觸發器有以下選擇: * 它可以返回`NULL`以忽略對當前行的操作。 這就指示執行器不要執行調用該觸發器的行級別操作(對特定行的插入或者更改)。 * 只用于`INSERT`和`UPDATE`行觸發器: 返回的行將成為被插入的行或者是成為將要更新的行。 這樣就允許觸發器函數修改將要被插入或者更新的行。 一個無意導致任何這類行為的在操作之前觸發的行級觸發器必須仔細返回那個被當作新行傳進來的行。 也就是說,對于`INSERT`和`UPDATE`觸發器而言, 是`NEW`行, 對于`DELETE`觸發器而言, 是`OLD`行。 行級別`INSTEAD OF`觸發器應該返回`NULL`表示它不修改來自視圖的基礎表的任何數據, 它應該返回傳遞到(`INSERT`和`UPDATE`的`NEW`行, 或者`DELETE`操作的`OLD`行 )的視圖行。非空返回值用于發信號,使觸發器執行視圖中必要的數據修改。 這將導致計算通過這個命令遞增的受影響的行數。 對于`INSERT`和`UPDATE`操作,觸發器可能在返回它之前修改`NEW`行。 這將改變通過`INSERT RETURNING`或者`UPDATE RETURNING`返回的數據。 并且當視圖不能完全顯示所提供的同一數據時是有用的。 對于在操作之后觸發的行級觸發器,其返回值會被忽略,因此可以返回`NULL`。 如果多于一個觸發器為同樣的事件定義在同樣的關系上, 觸發器將按照名字的字母順序觸發。 在`BEFORE`和 `INSTEAD OF`觸發器的情況下, 每個觸發器返回的可能已經被修改過的行成為下一個觸發器的輸入。 如果`BEFORE`或者`INSTEAD OF`觸發器返回`NULL`, 那么對該行的操作將被丟棄并且隨后的觸發器也不會被觸發。 一個觸發器定義也可以聲明一個布爾型的`WHEN`條件,用于檢查觸發器是否應該被觸發。 在行級別觸發器上,`WHEN`條件可以檢查舊和/或新的列值。語句級的觸發器也可以有`WHEN`條件, 盡管對其沒有用。在一個`BEFORE`觸發器中,`WHEN`條件只在函數正在或將被執行之前被觸發執行, 因此使用`WHEN`條件實際上與在觸發器開始時執行相同條件的結果是一樣的。然而, 在一個`AFTER`觸發器中,`WHEN`條件只有在發生更新行時才會執行, 并且決定在語句結束之后, 一個事件是否需要等待觸發觸發器。因此當一個`AFTER`觸發器的`WHEN`條件沒有返回真時, 隊列中的時間不需要在語句結束后重新讀取行。如果觸發器只會被一些行觸發時, `INSTEAD OF`觸發器不支持`WHEN`條件。 通常,行的`BEFORE`觸發器用于檢查或修改將要插入或者更新的數據。 比如,一個`BEFORE`觸發器可以用于把當前時間插入一個`timestamp`字段, 或者跟蹤該行的兩個元素是一致的。行的`AFTER`觸發器多數用于填充或者更新其它表, 或者對其它表 進行一致性檢查。這么區分工作的原因是`AFTER`觸發器肯定可以看到該行的最后數值, 而`BEFORE`觸發器不能;還可能有其它的`BEFORE`觸發器在其后觸發。 如果你沒有具體的原因定義觸發器是`BEFORE`或者 `AFTER`, 那么`BEFORE`觸發器的效率高些, 因為操作相關的信息不必保存到語句的結尾。 如果一個觸發器函數執行SQL命令,而這些命令再次觸發觸發器, 這就是所謂的級聯觸發器。對級聯觸發器的級聯深度沒有明確的限制。 有可能出現級聯觸發器導致同一個觸發器遞歸調用的情況; 比如,一個`INSERT`觸發器可能執行一個命令, 把一個額外的行插入同一個表中, 導致`INSERT`觸發器再次觸發。 避免這樣無窮遞歸的問題是觸發器程序員的責任。 在定義一個觸發器的時候,可以聲明一些參數。 在觸發器定義中包含參數的目的是允許類似需求的不同觸發器調用同一個函數。 比如,可能有一個通用的觸發器函數,接受兩個字段名字,把當前用戶放在第一個, 而當前時間戳在第二個。只要寫得恰當, 那么這個觸發器函數就可以和觸發它的特定表無關。 這樣同一個函數就可以用于有著合適字段的任何表的`INSERT`事件, 實現自動跟蹤交易表中的記錄創建之類的問題。 如果定義成一個`UPDATE`觸發器,還可以用它跟蹤最后更新的事件。 每種支持觸發器的編程語言都有自己的方法讓觸發器函數得到輸入數據。 這些輸入數據包括觸發器事件的類型(比如`INSERT`或者`UPDATE`)以及所有 在`CREATE TRIGGER`里面列出的參數。對于低層次的觸發器, 輸入數據也包括`INSERT`和 `UPDATE`觸發器的`NEW` 和/或`UPDATE`和`DELETE`觸發器的`OLD`行。 語句級別的觸發器目前沒有任何方法檢查該語句修改的獨立行。
                  <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>

                              哎呀哎呀视频在线观看