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

Оракул 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;

person Ralph    schedule 09.02.2012    source источник
comment
Можете ли вы объяснить, что означает «не работает» в данном конкретном случае? Вы получаете ошибку? Если да, то какая ошибка? Если вы не получаете ошибку, какое поведение вы видите или не видите, что вы ожидаете? Можете ли вы опубликовать пример кода, который воспроизводит проблему?   -  person Justin Cave    schedule 09.02.2012
comment
Под не работает я подразумеваю, что глядя на соответствующую таблицу очереди, она остается пустой. При запуске процедуры под sqldeveloper я не получаю никаких ошибок и вижу новую запись в таблице очереди.   -  person Ralph    schedule 09.02.2012
comment
Я не уверен, будет ли полезна публикация исходного кода на этом этапе, потому что процедура работает нормально, а также я использую жестко закодированные значения, чтобы исключить любую возможность недопустимых входных данных.   -  person Ralph    schedule 09.02.2012
comment
Было бы полезно, если бы вы могли опубликовать тестовый пример, который воспроизводит проблему. В противном случае довольно сложно предположить, в чем может быть проблема.   -  person Justin Cave    schedule 09.02.2012
comment
Можете ли вы опубликовать код процедуры и триггера?   -  person    schedule 09.02.2012


Ответы (2)


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

person REW    schedule 09.02.2012
comment
Да, это будет в вашем вызове DBMS_AQ.ENQUEUE. У меня была эта проблема, когда я недавно написал набор Java/PLSQL для обработки сообщений XML (SAML2). Например, предположим, что SAMPLE1 владеет очередью с именем QUEUE1, тогда в вызовах DBMS_AQ потребуется указать SAMPLE1.QUEUE1, иначе она будет искать любые объекты пользователя, под которыми они вошли в систему. - person REW; 09.02.2012
comment
Хорошо, поэтому я определил свою очередь с именем схемы, как в приведенном выше коде. Все равно ничего хорошего. - person Ralph; 09.02.2012
comment
Никаких ошибок, если я запускаю из sqldeveloper. Я не знаю, как проверить наличие ошибок при запуске из приложения. - person Ralph; 09.02.2012
comment
Можете ли вы войти в систему как пользователь в sqldeveloper и вставить фиктивную запись? - person REW; 09.02.2012
comment
Не уверен, что вы имеете в виду. Если я вхожу в sqldeveloper, я могу обновить таблицу, которая вызывает срабатывание триггера, который, в свою очередь, вызывает процедуру, которая затем вставляет запись в таблицу очереди. - person Ralph; 09.02.2012

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

person Ralph    schedule 09.10.2012