Вот определение хранимой процедуры:
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;
Вот звонок:
CALL usp_dropTable('SOMESCHEMA', 'SOME_TABLE');
По какой-то причине я продолжаю получать ошибку недостаточных привилегий для команды EXECUTE IMMEDIATE. Я посмотрел в Интернете и обнаружил, что ошибка недостаточных привилегий обычно означает, что учетная запись пользователя оракула не имеет привилегий для команды, используемой в передаваемом запросе, в данном случае это 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;
Спасибо всем за ответы. Это была определенно очень раздражающая проблема, чтобы найти решение.