FirebirdSQL logo

NEW

Доступно в

PSQL

Синтаксис
NEW

Контекстная переменная NEW доступна только в коде табличных триггеров.Значение NEW содержит новые значения полей данных, которое возникли в базе во время операции обновления или вставки.

В AFTER триггерах переменная доступна только для чтения.

Note

Для табличных триггеров, срабатывающих на несколько типов событий, переменная NEW доступна всегда.Однако в случае если триггер сработал на операцию удаления, то для него новая версия данных не имеет смысла.В этой ситуации чтение переменной NEW всегда вернёт NULL.

Important

Попытка записи в переменную NEW в AFTER триггере вызовет исключение в коде.

Example 1. Использование переменной NEW
...
  IF (NEW.SERIAL_NUM IS NULL) THEN
    NEW.SERIAL_NUM = GEN_ID (GEN_SERIALS, 1);
...
См. также:

[fblangref-contextvars-old].

OLD

Доступно в

PSQL

Синтаксис
OLD

Контекстная переменная OLD доступна только коде триггеров.Значения, содержащееся в OLD, хранит прошлые значения полей, которые были в базе до операции изменения или удаления.

Переменная OLD доступна только для чтения.

Note

Для табличных триггеров, срабатывающих на несколько типов событий, значения для переменной OLD всегда возможны.Однако для триггеров, сработавших на вставку записи, значение данной переменной не имеет смысла, поэтому в этой ситуации чтение OLD возвратит NULL, а попытка записи в неё вызовет исключение в коде.

Example 1. Использование переменной OLD
...
  IF (NEW.QUANTITY IS DISTINCT FROM OLD.QUANTITY) THEN
    DELTA = NEW.QUANTITY - OLD.QUANTITY;
...
См. также:

[fblangref-contextvars-new].

RESETTING

Доступно в

PSQL

Синтаксис
RESETTING
Тип возвращаемого результата

BOOLEAN

Контекстная переменная RESETTING доступна только коде триггеров на события ON CONNECT и ON DISCONNECT, и может использоваться в любом месте, где можно использовать логический предикат.Системная переменная RESETTING, позволяет обнаружить случай, когда триггер базы данных срабатывает из-за сброса сеанса, например с помощью оператора ALTER SESSION RESET.Её значение TRUE, если выполняется сброс сеанса, и FALSE в противном случае.

Example 1. Использование переменной RESETTING
...
IF (RESETTING) THEN
BEGIN
  -- выполняется сброс сеанса
END
...
См. также:

ALTER SESSION RESET.

ROW_COUNT

Доступно в

PSQL

Синтаксис
ROW_COUNT
Тип возвращаемого результата

BIGINT

Контекстная переменная ROW_COUNT содержит число строк, затронутых последним оператором DML(INSERT, UPDATE, DELETE, SELECT или FETCH) в текущем триггере, хранимой процедуре или исполняемом блоке.

Поведение с SELECT и FETCH:

  • После выполнения singleton SELECT запроса (запроса, который может вернуть не более одной строки данных),ROW_COUNT равна 1, если была получена строка данных и 0 в противном случае;

  • В цикле FOR SELECT переменная ROW_COUNT увеличивается на каждой итерации (начиная с 0 в качестве первого значения);

  • После выборки (FETCH) из курсора, ROW_COUNT равна 1, если была получена строка данных и 0 в противном случае. Выборка нескольких записей из одного курсора не увеличивает ROW_COUNT после 1.

Important

Переменная ROW_COUNT не может быть использована для определения количества строк, затронутых при выполненииоператоров EXECUTE STATEMENT или EXECUTE PROCEDURE.Для оператора MERGE переменная ROW_COUNT будет содержать 0 или 1, даже если было затронуто более записей

Warning

Не используйте переменную ROW_COUNT внутри DML операторов.Дело в том, что эта переменная сбрасывает своё значение в 0 перед началом выполнения любого DML оператора, а потому вы можете получить не то что ожидаете.

...
UPDATE t2 SET
    evt='upd',
    old_id = old.id, old_x = old.x,
    new_id = new.id, new_x = new.x
WHERE new_id = old.id;

INSERT INTO t2log(evt, affected_rows) VALUES('upd', ROW_COUNT);
...

В вышеприведённом примере в столбец affected_rows будут записаны нулевые значения, даже если оператором UPDATE были затронуты строки.Для того чтобы исправить эту ошибку, необходимо сохранить значение контекстной переменной ROW_COUNT в локальную переменную PSQL модуля и использовать эту локальную переменную в DML операторе.

...
DECLARE rc INT;
...
UPDATE t2 SET
    evt='upd',
    old_id = old.id, old_x = old.x,
    new_id = new.id, new_x = new.x
WHERE new_id = old.id;

rc = ROW_COUNT;
INSERT INTO t2log(evt, affected_rows) VALUES('upd', rc);
...
Example 1. Использование переменной ROW_COUNT
...
UPDATE Figures SET Number = 0 WHERE id = :id;
IF (row_count = 0) THEN
  INSERT INTO Figures (id, Number)
  VALUES (:id, 0);
...