sql >> Database teknologi >  >> RDS >> Oracle

oracle-tabel eller -visning eksisterer ikke inde fra den lagrede procedure

Sandsynligvis er problemet, at bevillingen er sket via en rolle. Privilegier tildelt en bruger er ikke tilgængelige i en definerers lagrede rettigheder (standard).

I SQL Developer er det relativt nemt at verificere, at dette er problemet. Hvis du kører kommandoen

SET ROLE none

og derefter køre SELECT-sætningen, ville jeg forvente, at du ville få den samme ORA-00942-fejl.

Hvis det antages, at det er tilfældet, vil løsningen generelt være at bede ejerne af tabellerne i YYY-skemaet om at give adgang til tabellerne direkte til dig i stedet for at give adgang via en rolle. Bortset fra det, kan du definere din lagrede procedure som en lagret procedure for invoker-rettigheder ved at tilføje AUTHID CURRENT_USER til erklæringen. Det betyder, at den, der kalder proceduren, skulle have adgang til de underliggende objekter, men det ville tillade dine procedurer at gøre brug af privilegier givet gennem en rolle.

Hvis du vil oprette en lagret procedure for invoker-rettigheder, skal du også referere til tabelnavnet ved hjælp af dynamisk SQL for at udskyde privilegiekontrollen til runtime. Så du ville have noget lignende

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;

hvis du ønskede en procedure for en påberåbers rettigheder lagret, der forespurgte tabellen TabelA i skema XXX.



  1. Fejlfinding, der løber tør for arbejdstråde

  2. Vis fuld SQL-forespørgsel i Vis procesliste for MySQL

  3. Udvidelse af brugen af ​​DBCC CLONEDATABASE

  4. Maksimal udførelsestid i phpMyadmin