sql >> Databasteknik >  >> RDS >> Oracle

Oracle-tabellen eller -vyn existerar inte inifrån den lagrade proceduren

Troligtvis är problemet att bidraget gjordes via en roll. Behörigheter som ges till en användare är inte tillgängliga i en definierarens lagrade rättigheter (standard).

I SQL Developer är det relativt enkelt att verifiera att det är detta som är problemet. Om du kör kommandot

SET ROLE none

och sedan köra SELECT-satsen, skulle jag förvänta mig att du skulle få samma ORA-00942-fel.

Förutsatt att så är fallet, skulle lösningen i allmänhet vara att be ägarna av tabellerna i YYY-schemat att ge åtkomst till tabellerna direkt till dig istället för att ge åtkomst via en roll. Utan detta kan du definiera din lagrade procedur som en lagrad procedur för anropers rättigheter genom att lägga till AUTHID CURRENT_USER i deklarationen. Det innebär att den som anropar proceduren skulle behöva ha tillgång till de underliggande objekten men det skulle tillåta dina procedurer att använda privilegier som beviljats ​​genom en roll.

Om du vill skapa en lagrad procedur för anropares rättigheter måste du också hänvisa till tabellnamnet med dynamisk SQL för att skjuta upp behörighetskontrollen till körning. Så du skulle ha något liknande

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;

om du ville ha en lagrad procedur för anroparrättigheter som frågade tabellen TabellA i schema XXX.



  1. Hur man listar tabeller i den aktuella databasen med PostgreSQL

  2. Databashantering och övervakning för PostgreSQL 12

  3. WordPress MySQL SQL-frågefel i WPDB-klass

  4. Anslut bord från två olika servrar