sql >> Database >  >> RDS >> Oracle

Oracle-tabel of weergave bestaat niet vanuit de opgeslagen procedure

Hoogstwaarschijnlijk is het probleem dat de subsidie ​​via een rol is gedaan. Bevoegdheden die aan een gebruiker zijn toegekend, zijn niet beschikbaar in de opgeslagen procedure voor de rechten van een definitie (de standaardinstelling).

In SQL Developer is het relatief eenvoudig om te controleren of dit het probleem is. Als u de opdracht

. uitvoert
SET ROLE none

en voer vervolgens de SELECT-instructie uit, ik zou verwachten dat u dezelfde ORA-00942-fout zou krijgen.

Ervan uitgaande dat dit het geval is, zou de oplossing over het algemeen zijn om de eigenaren van de tabellen in het YYY-schema te vragen u rechtstreeks toegang tot de tabellen te verlenen in plaats van toegang te verlenen via een rol. Behalve dat, zou u uw opgeslagen procedure kunnen definiëren als een opgeslagen procedure van de rechten van een aanroeper door AUTHID CURRENT_USER toe te voegen aan de aangifte. Dat zou betekenen dat de aanroeper van de procedure toegang moet hebben tot de onderliggende objecten, maar dat uw procedures gebruik kunnen maken van privileges die via een rol zijn verleend.

Als u de opgeslagen procedure van een aanroeper wilt maken, moet u ook naar de tabelnaam verwijzen met dynamische SQL om de privilegecontrole uit te stellen tot runtime. Dus je zou zoiets hebben als

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;

als u de opgeslagen procedure van een aanroeper wilt die de tabel TableA in schema XXX opvraagt.



  1. Kleur en lettertypen wijzigen in SQL Server Management Studio (SSMS) - SQL Server / TSQL-zelfstudie, deel 12

  2. Schakel alle tabelindexen in Oracle uit en later weer in

  3. Een datum opmaken in T-SQL

  4. UUID-botsingsrisico met verschillende algoritmen