Как вы ссылаетесь на элементы приложения APEX в Trigger - PullRequest
0 голосов
/ 18 февраля 2020

Я создаю триггер BEFORE DELETE для вставки записей в архивную таблицу, которые удаляются через форму APEX в другой таблице. Я хочу обновить два столбца "UPDATED_BY" и "UPDATED" _DATE "на основе SYSDATE и: APP_USER (элемент приложения APEX). Я получаю ошибку, связанную с: APP_USER (PLS-00049: переменная плохого связывания 'APP_USER' Есть ли определенный синтаксис c, который я должен использовать для ссылки на элементы приложения APEX при создании триггера?

CREATE OR REPLACE TRIGGER  "ARCHIVE_DELETED_RECORDS" 
BEFORE
delete on "RECORD_TABLE"
for each row
begin
INSERT INTO DELETED_RECORD_TABLE (
    STAGING_ID,
    SOURCE_FILE_ID,
    DELETION_DATE,
    DELETED_BY,
    DELETED_FROM)
SELECT
    STAGING_ID,
    SOURCE_FILE_ID,
    SYSDATE,
    :APP_USER,
    'Record Table 1'
FROM RECORD_TABLE
end;
/
ALTER TRIGGER  "ARCHIVE_DELETED_RECORDS" ENABLE;

1 Ответ

2 голосов
/ 18 февраля 2020

Вы можете использовать функцию V() для прямой ссылки на переменные связывания APEX, такие как :APP_USER в триггере базы данных, или на самом деле в любом PL / SQL вне APEX. APEX также обычно использует состояние пакета для хранения глобальных переменных , к которым необходимо обращаться извне. См. Здесь для некоторого обсуждения .

В вашем случае, вместо :APP_USER, вы можете использовать V('APP_USER') или APEX_APPLICATION.G_USER. Документация здесь .

Обратите внимание, что если записи удаляются из вашей таблицы за пределами APEX (например, администратором базы данных, выполняющим delete from RECORD_TABLE), поле DELETED_BY будет нулевым. Поэтому вам может понадобиться что-то вроде:

COALESCE(V('APP_USER'), SYS_CONTEXT ('USERENV', 'OS_USER'), USER)

Предпочитать пользователя APEX, если он доступен, или пользователя ОС, если он доступен, или, наконец, текущего пользователя схемы, если ничего другого не доступно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...