RDB$TRIGGERS

Версии сервера

0.91.01.5.31.5.41.5.52.02.0.32.0.42.12.53.0
ДаДаДаДаДаДаДаДаДаДаДа

Доступно в

DSQL, ESQL, ISQL, PSQL

Формат

CREATE TABLE RDB$TRIGGERS (
    RDB$TRIGGER_NAME      CHAR(31) CHARACTER SET UNICODE_FSS,
    RDB$RELATION_NAME     CHAR(31) CHARACTER SET UNICODE_FSS,
    RDB$TRIGGER_SEQUENCE  SMALLINT,
    RDB$TRIGGER_TYPE      SMALLINT,
    RDB$TRIGGER_SOURCE    BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS,
    RDB$TRIGGER_BLR       BLOB SUB_TYPE 2 SEGMENT SIZE 80,
    RDB$DESCRIPTION       BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS,
    RDB$TRIGGER_INACTIVE  SMALLINT,
    RDB$SYSTEM_FLAG       SMALLINT,
    RDB$FLAGS             SMALLINT,
    RDB$VALID_BLR         SMALLINT,
    RDB$DEBUG_INFO        BLOB SUB_TYPE 9 SEGMENT SIZE 80
);

CREATE INDEX RDB$INDEX_38 ON RDB$TRIGGERS (RDB$RELATION_NAME);
CREATE UNIQUE INDEX RDB$INDEX_8 ON RDB$TRIGGERS (RDB$TRIGGER_NAME);

Описание

Системная таблица RDB$TRIGGERS содержит информацию о всех триггерах в базе данных.

Имя столбцаТипОписание
RDB$TRIGGER_NAMECHAR(31)Имя триггера. Должно быть уникально.
RDB$RELATION_NAMECHAR(31)Имя просмотра или таблицы, для которой используется триггер.
RDB$TRIGGER_SEQUENCESMALLINTПоследовательность выполнения триггера в рамках его действия. По-умолчанию - ноль.
RDB$TRIGGER_TYPESMALLINTТип триггера - определяет событие, при котором произойдет выполнение триггера. См. ниже.
RDB$TRIGGER_SOURCEBLOBХранит PSQL -исходный код триггера.
RDB$TRIGGER_BLRBLOBХранит скомпилированное сервером тело триггера в двоичном виде.
RDB$DESCRIPTIONBLOBСлужит для хранения пользовательской документации о триггере.
RDB$TRIGGER_INACTIVESMALLINTПризнак, является ли триггер в настоящее время неактивным (“1” - триггер “отключен”, “0” - триггер активен).
RDB$SYSTEM_FLAGSMALLINTПризнак того, что триггер определен системой (1) или пользователем (не равно 1)
RDB$FLAGSSMALLINTДля внутреннего использования
RDB$VALID_BLRSMALLINTНе документировано
RDB$DEBUG_INFOBLOBНе документировано

Определены следующие типы триггеров по событию:

1BEFORE INSERTТриггер выполняется перед вставкой записи в таблицу или просмотр.
2AFTER INSERTТриггер выполняется после вставки записи в таблицу или просмотр.
3BEFORE UPDATEТриггер выполняется перед изменением записи в таблице или просмотре.
4AFTER UPDATEТриггер выполняется после изменения записи в таблице или просмотре.
5BEFORE DELETEТриггер выполняется перед удалением записи из таблицы или просмотра.
6AFTER DELETEТриггер выполняется после удаления записи из таблицы или просмотра.
17BEFORE INSERT OR UPDATEТриггер выполняется перед вставкой или изменением записи в таблице или просмотре.
18AFTER INSERT OR UPDATEТриггер выполняется после вставки или изменения записи в таблице или просмотре.
25BEFORE INSERT OR DELETEТриггер выполняется перед вставкой или удалением записи в таблице или просмотре.
26AFTER INSERT OR DELETEТриггер выполняется после вставки или удаления записи в таблице или просмотре.
27BEFORE UPDATE OR DELETEТриггер выполняется перед изменением или удалением записи в таблице или просмотре.
28AFTER UPDATE OR DELETEТриггер выполняется после изменения или удаления записи в таблице или просмотре.
113BEFORE INSERT OR UPDATE OR DELETEТриггер выполняется перед вставкой, изменением или удалением записи в таблице или просмотре.
114AFTER INSERT OR UPDATE OR DELETEТриггер выполняется после вставки, изменения или удаления записи в таблице или просмотре.
8192ON CONNECTТриггер выполняется после установления подключения к базе данных.
8193ON DISCONNECTТриггер выполняется перед отключением от базы данных.
8194ON TRANSACTION STARTТриггер выполняется после старта транзакции.
8195ON TRANSACTION COMMITТриггер выполняется перед подтверждением COMMIT транзакции.
8196ON TRANSACTION ROLLBACKТриггер выполняется перед отменой ROLLBACK транзакции.

Пример

Следующий пример выводит список всех триггеров для таблицы MY_TABLE

SELECT T.RDB$TRIGGER_NAME, T.RDB$TRIGGER_SEQUENCE,
    CASE T.RDB$TRIGGER_TYPE
      WHEN   1 THEN 'BEFORE INSERT'
      WHEN   2 THEN 'AFTER INSERT'
      WHEN   3 THEN 'BEFORE UPDATE'
      WHEN   4 THEN 'AFTER UPDATE'
      WHEN   5 THEN 'BEFORE DELETE'
      WHEN   6 THEN 'AFTER DELETE'
      WHEN  17 THEN 'BEFORE INSERT OR UPDATE'
      WHEN  18 THEN 'AFTER INSERT OR UPDATE'
      WHEN  25 THEN 'BEFORE INSERT OR DELETE'
      WHEN  26 THEN 'AFTER INSERT OR DELETE'
      WHEN  27 THEN 'BEFORE UPDATE OR DELETE'
      WHEN  28 THEN 'AFTER UPDATE OR DELETE'
      WHEN 113 THEN 'BEFORE INSERT OR UPDATE OR DELETE'
      WHEN 114 THEN 'AFTER INSERT OR UPDATE OR DELETE'
    END AS TRIGGER_TYPE
FROM  RDB$TRIGGERS T
WHERE (T.RDB$RELATION_NAME = 'MY_TABLE')

Следующий PSQL-блок вернет DSQL скрипт создания триггера, имя которого передано в качестве параметра TRIGGER_NAME.

EXECUTE BLOCK(
  A_TRIGGER_NAME VARCHAR(31) = ?TRIGGER_NAME
)RETURNS(
  DDLSQL BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS
)AS
  DECLARE VARIABLE P_TRIGGER_NAME   VARCHAR(31);
  DECLARE VARIABLE P_RELATION_NAME  VARCHAR(31);
  DECLARE VARIABLE P_TRIGGER_TYPE   VARCHAR(80);
  DECLARE VARIABLE P_TRIGGER_ACTIVE VARCHAR(8);
  DECLARE VARIABLE P_TRIGGER_POS    INTEGER;
  DECLARE VARIABLE P_TRIGGER_SRC    BLOB SUB_TYPE 1 SEGMENT SIZE 80
                                          CHARACTER SET UNICODE_FSS;
BEGIN
  DDLSQL = '';
  SELECT FIRST 1 TRIM(T.RDB$TRIGGER_NAME), TRIM(T.RDB$RELATION_NAME),
      T.RDB$TRIGGER_SEQUENCE, T.RDB$TRIGGER_SOURCE,
      CASE T.RDB$TRIGGER_INACTIVE
        WHEN 1 THEN 'INACTIVE'
        WHEN 0 THEN 'ACTIVE'
      END AS TRIG_ACTIVE,
      CASE T.RDB$TRIGGER_TYPE
        WHEN   1 THEN 'BEFORE INSERT'
        WHEN   2 THEN 'AFTER INSERT'
        WHEN   3 THEN 'BEFORE UPDATE'
        WHEN   4 THEN 'AFTER UPDATE'
        WHEN   5 THEN 'BEFORE DELETE'
        WHEN   6 THEN 'AFTER DELETE'
        WHEN  17 THEN 'BEFORE INSERT OR UPDATE'
        WHEN  18 THEN 'AFTER INSERT OR UPDATE'
        WHEN  25 THEN 'BEFORE INSERT OR DELETE'
        WHEN  26 THEN 'AFTER INSERT OR DELETE'
        WHEN  27 THEN 'BEFORE UPDATE OR DELETE'
        WHEN  28 THEN 'AFTER UPDATE OR DELETE'
        WHEN 113 THEN 'BEFORE INSERT OR UPDATE OR DELETE'
        WHEN 114 THEN 'AFTER INSERT OR UPDATE OR DELETE'
      END AS TRIGGER_TYPE
  FROM  RDB$TRIGGERS T
  WHERE (UPPER(TRIM(T.RDB$TRIGGER_NAME)) =  :A_TRIGGER_NAME)
  INTO  :P_TRIGGER_NAME, :P_RELATION_NAME, :P_TRIGGER_POS, :P_TRIGGER_SRC,
        :P_TRIGGER_ACTIVE, :P_TRIGGER_TYPE;

  DDLSQL = 'CREATE OR ALTER TRIGGER '||:P_TRIGGER_NAME||' FOR '||
    :P_RELATION_NAME||' '||ASCII_CHAR(13)||ASCII_CHAR(10)||
    :P_TRIGGER_ACTIVE||'  '||:P_TRIGGER_TYPE||' POSITION '||:P_TRIGGER_POS||
    ' '||ASCII_CHAR(13)||ASCII_CHAR(10)||:P_TRIGGER_SRC;

  SUSPEND;
END

См. также

Системные таблицы, CREATE TRIGGER, DROP TRIGGER, ALTER TRIGGER

Источник

Обсуждение