Różnica Między ALL_TABLES, a DBA_TABLES
Przeglądając anglojęzyczne forum o Oracle natknąłem się na błędną informację, że tabela ALL_TABLES to tylko synonim tabeli DBA_TABLES wprowadzony w wersji 11g. Poniżej na przykładzie wyjaśnię, że to nie jest prawda i do każdej informacji należy podchodzić z wielką rezerwą.
CREATE USER USER1 IDENTIFIED BY user1 / CREATE USER USER2 IDENTIFIED BY user2 / GRANT CONNECT TO USER1 / GRANT CONNECT TO USER2 / GRANT CREATE TABLE TO USER1 / GRANT CREATE TABLE TO USER2 /
--Tworzenie tabeli na userze USER1 CREATE TABLE USER1.T1(id NUMBER) / --Tworzenie tabeli na userze USER2 CREATE TABLE USER2.T2(descr VARCHAR2(100)) /
Logując się na użytkowniku USER2 i wykonując poniższą instrukcję SELECT z tabeli ALL_TABLES nie zostanie zwrócony rekord z informacją o tabeli USER1.T1. Zupełnie inna sprawa ma się kiedy to samo zrobione jest z tabeli DBA_TABLES.
SELECT owner, table_name FROM all_tables WHERE table_name = 'T1' /
(norows)
SELECT owner, table_name FROM dba_tables WHERE table_name = 'T1' /
OWNER TABLE_NAME
----- ----------
USER1 T1
Jeżeli jednak zostanie dodane uprawnienie (GRANT) z możliwością wykonywania instrukcji SELECT na tabeli T1 dla użytkownika USER2, sytuacja ulegnie zmianie i rekord z informacją o tabeli T1 będzie widoczny w tabeli ALL_TABLES.
GRANT ALL ON T1 TO USER2 / SELECT owner, table_name FROM all_tables WHERE table_name = 'T1' /
Podsumowując, wykorzystując tabelę DBA_TABLES można uzyskać informację o wszystkich tabelach składowanych w bazie danych. Tabela ALL_TABLES zwraca tylko te tabele, które są w jakiejkolwiek relacji z użytkownikiem, na którym instrukcja SELECT jest wykonywana.
Sytuacja nie dotyczy tylko tabel DBA_TABLES i ALL_TABLES, ale całej rodziny tabel DBA% i ALL%.
Szymon
Komentarze |0|
Tagi: ALL_TABLES, CREATE, DBA_TABLES, GRANT, TABLE, USER