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|

Legenda *) Pola oznaczone gwiazdką są wymagane
**) Możesz używać tych znaczników i atrybutów HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>