<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國際加速解決方案。 廣告
                # 36.3\. 用C寫觸發器 本章描述觸發器函數的低層細節。只有當你用C書寫觸發器函數的時候才需要這些信息。 如果你用某種高級語言寫觸發器,那么系統就會為你處理這些細節。 在大多數情況下,你在書寫自己的C觸發器之前應該考慮使用過程語言。 每種過程語言的文檔里面都有關于如何用該語言書寫觸發器的解釋。 觸發器函數必須使用"version 1"的函數管理器接口。 當一個函數被觸發器管理器調用時,它不會收到任何普通參數, 而是收到一個指向`TriggerData`結構的"context"指針。 C函數可以通過執行下面的宏來檢查它們是否是從觸發器管理器調用的 ``` CALLED_AS_TRIGGER(fcinfo) ``` 擴展到: ``` ((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData)) ``` 如果此宏返回真(TRUE),則可以安全地把 `fcinfo-&gt;context`轉換成`TriggerData*`類型, 然后使用這個指向`TriggerData`的結構。 函數本身絕_不能_更改`TriggerData`結構或者它指向的任何數據。 `struct TriggerData`是在 `commands/trigger.h`中被定義的: ``` typedef struct TriggerData { NodeTag type; TriggerEvent tg_event; Relation tg_relation; HeapTuple tg_trigtuple; HeapTuple tg_newtuple; Trigger *tg_trigger; Buffer tg_trigtuplebuf; Buffer tg_newtuplebuf; } TriggerData; ``` 這些成員的定義如下: `type` 總是`T_TriggerData`。 `tg_event` 描述調用函數的事件。你可以用下面的宏檢查`tg_event`: `TRIGGER_FIRED_BEFORE(tg_event)` 如果觸發器是在操作前觸發,返回真。 `TRIGGER_FIRED_AFTER(tg_event)` 如果觸發器是在操作后觸發,返回真。 `TRIGGER_FIRED_INSTEAD(tg_event)` 如果觸發器觸發了相反的操作,返回真。 `TRIGGER_FIRED_FOR_ROW(tg_event)` 如果觸發器是行級別事件觸發,返回真。 `TRIGGER_FIRED_FOR_STATEMENT(tg_event)` 如果觸發器是語句級別事件觸發,返回真。 `TRIGGER_FIRED_BY_INSERT(tg_event)` 如果觸發器是由`INSERT`觸發,返回真。 `TRIGGER_FIRED_BY_UPDATE(tg_event)` 如果觸發器是由`UPDATE`觸發,返回真。 `TRIGGER_FIRED_BY_DELETE(tg_event)` 如果觸發器是由`DELETE`觸發,返回真。 `TRIGGER_FIRED_BY_TRUNCATE(tg_event)` 如果觸發器是由`TRUNCATE`命令觸發,返回真。 `tg_relation` 是一個指向描述被觸發的關系的結構的指針。 請參考`utils/rel.h`獲取關于此結構的詳細信息。 最讓人感興趣的事情是`tg_relation-&gt;rd_att`(關系行的描述) 和`tg_relation-&gt;rd_rel-&gt;relname` (關系名。這個變量的類型不是`char*`而是`NameData`。 如果你需要一份名字的拷貝, 用`SPI_getrelname(tg_relation)`獲取`char*`)。 `tg_trigtuple` 是一個指向觸發觸發器的行的指針。 這是一個正在被插入(INSERT)、刪除(DELETE)、或更新(UPDATE)的行。 如果是`INSERT`或者`DELETE`, 如果你不想用另一條行覆蓋此行(就`INSERT`來說)或忽略操作, 那么這就是你將從函數返回的東西。 `tg_newtuple` 如果是`UPDATE`,這是一個指向新版本的行的指針, 如果是`INSERT`或者`DELETE`,則是`NULL`。 如果事件是`UPDATE`并且你不想用另一條行替換這條行或忽略操作的話, 這就是你將從函數返回的東西。 `tg_trigger` 是一個指向結構`Trigger`的指針,該結構在`utils/reltrigger.h`里定義: ``` typedef struct Trigger { Oid tgoid; char *tgname; Oid tgfoid; int16 tgtype; char tgenabled; bool tgisinternal; Oid tgconstrrelid; Oid tgconstrindid; Oid tgconstraint; bool tgdeferrable; bool tginitdeferred; int16 tgnargs; int16 tgnattr; int16 *tgattr; char **tgargs; char *tgqual; } Trigger; ``` `tgname`是觸發器的名稱,`tgnargs`是在`tgargs`里參數的數量, `tgargs`是一個指針數組,數組里每個指針指向在`CREATE TRIGGER`語句里聲明的參數。 其它成員只在內部使用。 `tg_trigtuplebuf` 如果沒有這樣的元組或者沒有存儲在磁盤緩沖區里, 則是包含`tg_trigtuple`或者`InvalidBuffer`的緩沖區。 `tg_newtuplebuf` 如果沒有這樣的元組或者它并未存儲在磁盤緩沖區里, 那么就是包含`tg_newtuple`或者`InvalidBuffer`的緩沖區。 一個觸發器函數必須返回一個`HeapTuple` 指針或者一個`NULL`指針(_不是_SQL的NULL值,也就是說不要設置`isNull`為真)。 請注意如果你不想修改正在被操作的行,那么要根據情況返回`tg_trigtuple`或者`tg_newtuple`。
                  <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>

                              哎呀哎呀视频在线观看