jueves, mayo 17, 2007

Esquema <> Usuario..

Es muy común escuchar que la gente asocia los términos usuario y esquema (user y schema). Esto puede ser cierto en algunos motores de bases de datos pero no en Oracle. Para Oracle, un USER es un nombre de una cuenta que se agrega a una base de datos, y un ESQUEMA es el conjunto de objetos que ese USUARIO posee. Si bien es cierto que uno de los pasos cuando uno crea un usuario es la creación del ESQUEMA en el que se almacenaran sus objetos, y que el nombre que se le asocia es el mismo que tiene el usuario, es bastante simple demostrar por que no es lo mismo una cosa que la otra.

$ORACLE?HOME/bin/>sqlplus pepe/1234@base
Connected.
SQL> select * from mi_tabla
2 /
OBJECT_ID OBJECT_NAME
---------- ------------------------------
80116 BIG_PK
80114 BIG_TABLE
45709 BP
45710 BP_PK

SQL> grant select on mi_tabla to carlos
2 /

Grant succeeded.

$ORACLE?HOME/bin/>sqlplus carlos/5678@base
Connected.
SQL> select * from mi_tabla
2 /
OBJECT_ID OBJECT_NAME
---------- ------------------------------
80404 ACTOR
80414 ACTOR_NT
45707 AP
45708 AP_PK
52765 ASSIGNMENT
49747 A_ID
52768 A_OBJTYP

7 rows selected.

SQL> alter session set current_schema=pepe
2 /

Session altered.

SQL> select * from mi_tabla
2 /
OBJECT_ID OBJECT_NAME
---------- ------------------------------
80116 BIG_PK
80114 BIG_TABLE
45709 BP
45710 BP_PK

SQL> select username, schemaname
2 from v$session
3 where sid in (select sid from v$mystat)
4 /
USERNAME SCHEMANAME
--------- -----------
carlos pepe

Lo más importante a recordar es que el comando alter session set current_schema solamente cambia el ESQUEMA por defecto del USUARIO. No modifica los privilegios que tenemos sobre ese ESQUEMA, ni cambian los resultados cuando hacemos una consulta que depende del nombre del usuario, como por ejemplo las consultas sobre las USER_ views.


$ORACLE?HOME/bin/>sqlplus pablo/1919@base
Connected.
SQL> select table_name from user_tables
2 /
TABLE_NAME
---------------------
T1
T2
T3

SQL> select * from t1
2 /
COL1 COL2
---------- ----------
1 BBBBBBBBBB

SQL> grant select on t1 to laura
2 /

Grant succeeded.

$ORACLE?HOME/bin/>sqlplus laura/6969@base
Connected.

SQL> select table_name from user_tables
2 /
TABLE_NAME
------------------------------
T1
T2

SQL> select * from t1
2 /
COL1 COL2
---------- ----------
1 AAAAAAAAAA

SQL> alter session set current_schema=pablo
2 /

Session altered.

SQL> select * from t1
2 /
COL1 COL2
---------- ----------
1 BBBBBBBBBB

SQL> select * from t2
2 /
select * from t2
*
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select * from laura.t2
2 /

no rows selected

SQL> select table_name from user_tables
2 /
TABLE_NAME
--------------------
T1
T2
Claramente la confusión surge de que existe una correspondencia 1 a 1 entre un usuario y un esquema, a parte de que el nombre de ambos es el mismo.

Stumble Upon Toolbar

No hay comentarios.: