Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Триггер Oracle для постановки в очередь/удаления из очереди не срабатывает

Автор вопроса: RalphОтветов: 2

Оракул 11г. У меня есть триггер, который вызывает процедуру. Эта процедура выполняет очередь и удаление из очереди. Когда я запускаю процедуру в sqldeveloper, она работает нормально. Если я обновляю таблицы, которые срабатывает триггер, процедура выполняется нормально. Если я войду в рассматриваемое приложение и запущу процесс, который вызывает срабатывание триггера, процедура не сработает. В частности, очередь и исключение из очереди не работают, потому что, если я удаляю код очереди/удаления из очереди и вместо этого делаю вставку в таблицу, процедура выполняется нормально.

Поэтому я думаю, что, возможно, есть проблема с разрешениями, из-за которой триггер не может выполниться на dbms_aq. Кто-нибудь знает, как это решить? Есть ли учетная запись пользователя, которая запускает триггеры, которым необходимо предоставить привилегии?

Я не думаю, что проблема в процедуре, потому что она работает нормально. Я также не передаю какие-либо динамические данные из триггера, поэтому способ, которым я запускаю процедуру в sqldeveloper, точно такой же, как триггер вызывает процедуру.

Примечание: продезинфицированный код

create or replace
TRIGGER mytrig
AFTER INSERT ON INVENTORY_TRANSACTION
FOR EACH ROW
WHEN ((NEW.CLIENT = 'abcwidgets') AND (NEW.CODE = 'Receipt'))
BEGIN
dschema.mypack.queue_receipt('abcwidgets','999','bbb','1','88');
EXCEPTION
WHEN OTHERS THEN NULL;
END;

PROCEDURE QUEUE_RECEIPT(
CLIENTID IN VARCHAR2
, RECEIPTID IN VARCHAR2
, SITEID IN VARCHAR2
, LINEID IN VARCHAR2
, UPDATE_QTY IN VARCHAR2
) AS
ctxHandle dbms_xmlgen.ctxHandle;
l_xml xmltype;
queueopts DBMS_AQ.ENQUEUE_OPTIONS_T;
msgprops DBMS_AQ.MESSAGE_PROPERTIES_T;
msgid RAW(16);

BEGIN
  ctxHandle := dbms_xmlgen.newContext('SELECT line_id,
user_data_4
FROM inventory
');
l_xml     := xmltype(dbms_xmlgen.getxml(ctxHandle));
 DBMS_AQ.ENQUEUE ('DSCHEMA.ABCWIDGETS_QUEUE',
  queueopts,
  msgprops,
  l_xml,
  msgid);
END QUEUE_RECEIPT;
  • Можете ли вы объяснить, что означает "не работает" в данном конкретном случае? Вы получаете ошибку? Если да, то какая ошибка? Если вы не получаете ошибку, какое поведение вы видите или не видите, что вы ожидаете? Можете ли вы опубликовать пример кода, который воспроизводит проблему? Justin Cave 09.02.2012
  • Под не работает я подразумеваю, что глядя на соответствующую таблицу очереди, она остается пустой. При запуске процедуры под sqldeveloper я не получаю никаких ошибок и вижу новую запись в таблице очереди. Ralph 09.02.2012
  • Я не уверен, будет ли полезна публикация исходного кода на этом этапе, потому что процедура работает нормально, а также я использую жестко закодированные значения, чтобы исключить любую возможность недопустимых входных данных. Ralph 09.02.2012
  • Было бы полезно, если бы вы могли опубликовать тестовый пример, который воспроизводит проблему. В противном случае довольно сложно предположить, в чем может быть проблема. Justin Cave 09.02.2012
  • Можете ли вы опубликовать код процедуры и триггера? 09.02.2012

queueoracleoracle11g

Ответы

Ответ 1 · REW

Вероятно, вам нужно полностью указать ИМЯ ОЧЕРЕДИ. Пространство имен очередей определяется во время выполнения, и при отсутствии общедоступного синонима в очередях оно сначала будет искать пространство имен вошедшего в систему пользователя, независимо от владельца процедуры. Если бы мне пришлось догадываться, когда вы входите в систему, чтобы запустить его в sqldeveloper, это, вероятно, как пользователь, которому принадлежит процедура, которую вы вызываете.

Ответ 2 · Ralph

Проблема была объяснена мне dba, который был немного выше моей головы. В пакете, который я использовал, было несколько объявлений переменных, которые были объявлены вне области тела. Я переместил их обратно в тела пакетов, и это заставило их начать работать.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы