Вот определение хранимой процедуры:Выполнение Immediate внутри хранимой процедуры продолжает давать Недостаточные priviliges ошибку
CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) IS
BEGIN
DECLARE v_cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_cnt
FROM all_tables
WHERE owner = schema
AND table_name = tblToDrop;
IF v_cnt > 0 THEN
EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
END IF;
END;
END;
Вот вызов:
По какой-то причине, я получаю недостаточное привилегии для команды EXECUTE IMMEDIATE. Я посмотрел онлайн и выяснил, что ошибка недостаточных привилегий обычно означает, что учетная запись пользователя oracle не имеет привилегий для команды, используемой в прохождении запроса, что в данном случае является DROP. Однако у меня есть привилегии на передачу. Я действительно смущен, и я не могу найти решение, которое работает для меня.
Спасибо вам заранее.
РЕШЕНИЕ:
Как Стив нижеперечисленным, модель безопасности Oracle странно, что он должен знать явно где-то в порядке, какие привилегии для использования. Способ сообщить Oracle о том, чтобы использовать ключевое слово AUTHID в инструкции CREATE OR REPLACE. Если вам нужен тот же уровень привилегий, что и создатель процедуры, вы используете AUTHID DEFINER. Если вы хотите, чтобы Oracle использовала привилегии пользователя, выполняющего хранимую процедуру, вы хотите использовать AUTHID CURRENT_USER. Объявление процедуры выглядит следующим образом:
CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR)
AUTHID CURRENT_USER IS
BEGIN
DECLARE v_cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_cnt
FROM all_tables
WHERE owner = schema
AND table_name = tblToDrop;
IF v_cnt > 0 THEN
EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
END IF;
END;
END;
Спасибо всем за отзыв. Это была определенно очень неприятная проблема, чтобы добраться до решения.
Я столкнулся аналогичные проблемы, но самое смешное, без использования «AUTHID DEFINER» или «AUTHID CURRENT_USER» процедура была выполнения для таблицы падения но не для создания таблицы. Решение AUTHID работает :) Спасибо! – Aniket
Спасибо, это два слова «AUTHID CURRENT_USER» решают мою проблему! Благодаря! – Roman