Ecco la definizione della stored procedure:Esecuzione immediata all'interno di una stored procedure continua a dare privilegi insufficienti errore
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;
Ecco la chiamata:
Per qualche ragione, continuo a ricevere insufficiente errore di privilegi per il comando ESEGUIRE IMMEDIATO. Ho cercato online e ho scoperto che l'errore di privilegi insufficiente di solito significa che l'account utente oracle non ha privilegi per il comando utilizzato nella query che passa, che in questo caso è DROP. Tuttavia, ho i privilegi di drop. Sono davvero confuso e non riesco a trovare una soluzione che funzioni per me.
Grazie a voi in anticipo.
SOLUZIONE:
Come Steve menzionato qui di seguito, modello di sicurezza Oracle è strano in quanto ha bisogno di sapere in modo esplicito da qualche parte nel procedimento che tipo di privilegi da utilizzare. Il modo per far sapere a Oracle che è usare la parola chiave AUTHID nell'istruzione CREATE OR REPLACE. Se si desidera lo stesso livello di privilegi del creatore della procedura, si utilizza AUTHID DEFINER. Se si desidera che Oracle utilizzi i privilegi dell'utente che esegue attualmente la procedura memorizzata, si desidera utilizzare AUTHID CURRENT_USER. La dichiarazione della procedura è la seguente:
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;
Grazie a tutti per aver risposto. Questo era sicuramente un problema molto fastidioso per arrivare alla soluzione.
stavo affrontando problema simile, ma la cosa divertente è senza usare 'AUTHID DEFINER' o 'AUTHID CURRENT_USER' la procedura è stata in esecuzione per il drop table affermazione ma non per creare tabella. La soluzione AUTHID funziona :) Grazie! – Aniket
Grazie, queste due parole "AUTHID CURRENT_USER" risolvono il mio problema! Grazie! – Roman