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
Lo más importante a recordar es que el comando
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 pepealter 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.
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.
$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
No hay comentarios.:
Publicar un comentario