Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Tabelle oder -Ansicht existiert nicht innerhalb der gespeicherten Prozedur

Das Problem besteht höchstwahrscheinlich darin, dass die Gewährung über eine Rolle erfolgte. Einem Benutzer gewährte Privilegien sind in einer gespeicherten Prozedur für Rechte eines Definierers nicht verfügbar (Standardeinstellung).

In SQL Developer ist es relativ einfach zu überprüfen, ob dies das Problem ist. Wenn Sie den Befehl

ausführen
SET ROLE none

und dann die SELECT-Anweisung ausführen, würde ich erwarten, dass Sie denselben ORA-00942-Fehler erhalten würden.

Unter der Annahme, dass dies der Fall ist, würde die Lösung im Allgemeinen darin bestehen, die Eigentümer der Tabellen im YYY-Schema zu bitten, Ihnen den Zugriff auf die Tabellen direkt zu gewähren, anstatt den Zugriff über eine Rolle zu gewähren. Abgesehen davon könnten Sie Ihre gespeicherte Prozedur als gespeicherte Prozedur mit Aufruferrechten definieren, indem Sie der Deklaration AUTHID CURRENT_USER hinzufügen. Das würde bedeuten, dass der Aufrufer der Prozedur Zugriff auf die zugrunde liegenden Objekte haben müsste, aber es würde Ihren Prozeduren erlauben, die durch eine Rolle gewährten Privilegien zu nutzen.

Wenn Sie eine gespeicherte Prozedur mit Aufruferrechten erstellen möchten, müssen Sie auch mithilfe von dynamischem SQL auf den Tabellennamen verweisen, um die Berechtigungsprüfung auf die Laufzeit zu verschieben. Sie hätten also etwas wie

CREATE OR REPLACE PROCEDURE PRC_SOMESP 
  AUTHID CURRENT_USER
AS 
  l_cnt pls_integer;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;

wenn Sie eine gespeicherte Prozedur mit Aufruferrechten wollten, die die TableA-Tabelle in Schema XXX abfragt.