Oto definicja procedury przechowywanej:Execute Immediate wewnątrz procedura przechowywana utrzymuje dając wystarczajÄ priviliges błąd
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;
Oto wezwanie:
Z jakiegoś powodu, trzymam się niewystarczające przywraca błąd polecenia EXECUTE IMMEDIATE. Sprawdziłem online i okazało się, że błąd niewystarczających uprawnień zwykle oznacza, że konto użytkownika Oracle nie ma uprawnień do polecenia użytego w zapytaniu, które jest przepustką, która w tym przypadku jest DROP. Mam jednak uprawnienia do upuszczania. Jestem naprawdę zdezorientowany i nie mogę znaleźć rozwiązania, które będzie dla mnie skuteczne.
Dziękuję z góry.
ROZWIĄZANIE:
Jak Steve wymienionych poniżej, model bezpieczeństwa Oracle jest dziwne, że to musi wiedzieć, wyraźnie gdzieś w procedurze jaką uprawnieniami do wykorzystania. Sposób, aby poinformować Oracle, że jest użycie słowa kluczowego AUTHID w instrukcji CREATE OR REPLACE. Jeśli chcesz mieć taki sam poziom przywilejów jak twórca procedury, użyj AUTHID DEFINER. Jeśli chcesz, aby baza danych Oracle korzystała z uprawnień użytkownika, który aktualnie uruchamia procedurę składowaną, chcesz użyć AUTORID CURRENT_USER. Deklaracja procedury wygląda następująco:
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;
Dziękuję wszystkim za odpowiedź. To był zdecydowanie bardzo irytujący problem, aby dostać się do rozwiązania.
byłem stoi podobny problem, ale najśmieszniejsze jest bez użycia „Definer AUTHID” lub „AUTHID CURRENT_USER” Procedura wykonywał dla tabeli rozwijanej instrukcja, ale nie dla utworzenia tabeli. AUTHID rozwiązanie działa :) Dzięki! – Aniket
Dzięki, te dwa słowa "AUTHID CURRENT_USER" rozwiązują mój problem! Dzięki! – Roman