sql >> Databáze >  >> RDS >> Oracle

Tabulka nebo pohled oracle neexistuje uvnitř uložené procedury

S největší pravděpodobností je problém v tom, že grant byl proveden prostřednictvím role. Oprávnění udělená uživateli nejsou dostupná v uložené proceduře s právy definujícího (výchozí).

V SQL Developer je poměrně snadné ověřit, že jde o problém. Pokud spustíte příkaz

SET ROLE none

a poté spusťte příkaz SELECT, očekával bych, že dostanete stejnou chybu ORA-00942.

Za předpokladu, že tomu tak je, řešením by obecně bylo požádat vlastníky tabulek ve schématu YYY, aby udělili přístup k tabulkám přímo vám, nikoli prostřednictvím role. Pokud tomu tak není, můžete svou uloženou proceduru definovat jako uloženou proceduru s právy vyvolávače přidáním AUTHID CURRENT_USER do deklarace. To by znamenalo, že volající procedury by musel mít přístup k základním objektům, ale umožnilo by to vašim procedurám využívat oprávnění udělená prostřednictvím role.

Chcete-li vytvořit uloženou proceduru s právy vyvolávače, budete se také muset odkázat na název tabulky pomocí dynamického SQL, abyste odložili kontrolu oprávnění na běhové prostředí. Takže byste měli něco jako

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;

pokud jste chtěli uloženou proceduru s právy vyvolávače, která se dotazovala na tabulku TableA ve schématu XXX.



  1. Při vkládání dat do oracle není platný měsíc

  2. Jak dotazovat pole DATETIME pouze pomocí data v Microsoft SQL Server?

  3. Jak nainstalovat MySQLdb (Knihovna pro přístup k datům Pythonu do MySQL) na Mac OS X?

  4. Ukládání raiserror zprávy SqlServeru v C#