Manejo de sinónimos

En esta ocasión y nuevamente basado en una búsqueda realizada en mi blog, dedico este post a explicar de manera ligera y clara el manejo de sinónimos en Oracle.

Un sinónimo en Oracle, es una representación local o pública de un objeto perteneciente a un esquema. Sirve para poder hacer referencia a aquel objeto sin tener que anteponer su esquema. Un sinónimo público puede ser visto por todos los usuarios, pero uno privado, sólo por el usuario que lo creó.

Para poder crear un sinónimo, el esquema o usuario que lo crea, tiene que tener alguno o ambos privilegios de los siguientes:

CREATE SYNONYM
CREATE PUBLIC SYNONYM

Para el caso de un sinónimo simple (no público), el usuario tiene que tener privilegio sobre el objeto al que le creará el sinónimo. Por ejemplo, si es una tabla, deberá tener al menos privilegio de select, insert, delete o update sobre la misma.

A través del siguiente ejemplo, se puede ver el uso de los sinónimos. Para esto, usaremos a los usuarios PRUEBA y PRUEBA2, que se crearán tan solo con el privilegio de connect y vemos qué tablas tiene el esquema SALT:

SQL> create user prueba identified by prueba
  2  default tablespace users
  3  temporary tablespace temp;

User created.

SQL> grant connect to prueba;

Grant succeeded.

SQL> create user prueba2 identified by prueba2
  2  default tablespace users
  3  temporary tablespace temp;

User created.

SQL> grant connect to prueba2;

Grant succeeded.

SQL> select table_name
  2  from   dba_tables
  3  where  owner = 'SALT';

TABLE_NAME
------------------------------
PERIODO
CAJA
CHECADOR
CLIENTE
CONNECTBY
EMPLEADO
EMPRESA
MOVIMIENTO
MOVIMIENTOD
PRUEBA
PRUEBA_INTEGER
TIPO

12 rows selected.

De las tablas de SALT, vamos a trabajar con periodo, aunque no tiene registros, pero nos servirá bastante. Ya con los usuarios creados y con sus privilegios asignados, nos conectamos con prueba e intentamos leer la tabla que seleccionamos:

SQL> conn prueba/prueba;
Connected.
SQL> select *
  2  from   salt.periodo;
from   salt.periodo
            *
ERROR at line 2:
ORA-00942: table or view does not exist

SQL> select *
  2  from   periodo;
from   periodo
       *
ERROR at line 2:
ORA-00942: table or view does not exist

Como se puede ver, no hay ningún acceso a la tabla en cuestión. Así, vamos a ver qué pasa cuando se le da privilegios a prueba para que pueda ver la tabla periodo de SALT:

SQL> conn / as sysdba
Connected.

SQL> grant select on salt.periodo to prueba;
Grant succeeded.

SQL> conn prueba/prueba
Connected.

SQL> select *
  2  from   salt.periodo;

no rows selected

Como se puede ver, ya tenemos acceso a la tabla, sin embargo, ahora podemos darle privilegios a PRUEBA para que pueda crear sinónimos y así, le creamos uno a la tabla periodo de SALT:

SQL> create synonym periodo for salt.periodo;
create synonym periodo for salt.periodo
*
ERROR at line 1:
ORA-01031: insufficient privileges

SQL> grant create synonym to prueba;
grant create synonym to prueba
*
ERROR at line 1:
ORA-01031: insufficient privileges

SQL> conn / as sysdba
Connected.

SQL> grant create synonym to prueba;
Grant succeeded.

SQL> conn prueba/prueba
Connected.

SQL> create synonym periodo for salt.periodo;
Synonym created.

SQL> select *
  2  from   periodo;

no rows selected

Con esto, ya desde el esquema PRUEBA, podemos hacer consultas sobre la tabla periodo de SALT, sin tener que anteponer el salt.; ahora, veámos qué pasa con un sinónimo público. La diferencia con el sinónimo privado  o normal, es que cualquiera puede ver el sinónimo público, sin embargo, aunque se tenga, no se puede tener acceso a su objeto a menos que se tenga el privilegio para poder ver, insertar, seleccionar, borrar o actualizar dicho objeto:

SQL> conn / as sysdba
Connected.

SQL> create public synonym periodo for salt.periodo;
Synonym created.

SQL> conn prueba/prueba
Connected.

SQL> drop synonym periodo;
Synonym dropped.

SQL> select *
  2  from   periodo;

no rows selected

como se puede ver, se mantiene la selección a la tabla a través del sinónimo público. Esto se puede ver porque se borró el sinónimo privado. Vamos a ver otro ejemplo ahora con PRUEBA2:

SQL> conn prueba2/prueba2
Connected.
SQL> select *
  2  from   periodo;
from   periodo
       *
ERROR at line 2:
ORA-00942: table or view does not exist

SQL> conn / as sysdba
Connected.

SQL> grant select on salt.periodo to prueba2;
Grant succeeded.

SQL> conn prueba2/prueba2
Connected.

SQL> select *
  2  from   periodo;

no rows selected

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

Anuncios

25 Responses to Manejo de sinónimos

  1. Bata says:

    Hola chico, gracias por la explicación muy clara y al grano, me ha sido de mucha utilidad tu información.

  2. orlandoolguin says:

    Hola Bata,

    Qué bueno que te ha sido de utilidad, espero que me sigas visitando.

    Orlando.

  3. Pingback: Problema al usar roles « Orlando Olguín Olvera

  4. Luis Fernando Beleno says:

    Hola, oracle 11g tiene problemas para crear sinonimos con el mismo nombre de la tabla?, porque he intentado hacerlo y me envia error al crearlo.

    create synonym gn_organismo for EGFOWN.gn_organismo
    Error en la línea de comandos:1 Columna:0
    Informe de error:
    Error SQL: ORA-01471: no se puede crear un sinónimo con el mismo nombre que el objeto
    01471. 00000 – “cannot create a synonym with same name as object”
    *Cause:
    *Action:

  5. orlandoolguin says:

    Hola Luis Fernando,

    Perdona por contestar hasta hoy, pero tenía trabajo.

    Hice esta pequeña prueba como SYS en una base de datos que tengo de pruebas y mira lo que me encontré:

    1. La versión y el usuario con el que estoy conectado:

    SQL> show user
    USER is “SYS”

    SQL> select *
    2 from v$version;

    BANNER
    ——————————————————————————–
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 – Production
    PL/SQL Release 11.2.0.2.0 – Production
    CORE 11.2.0.2.0 Production
    TNS for 32-bit Windows: Version 11.2.0.2.0 – Production
    NLSRTL Version 11.2.0.2.0 – Production

    2. Las tablas del usuario HR:

    SQL> select table_name
    2 from dba_tables
    3 where owner = ‘HR’;

    TABLE_NAME
    ——————————
    REGIONS
    LOCATIONS
    DEPARTMENTS
    JOBS
    EMPLOYEES
    JOB_HISTORY
    COUNTRIES

    7 rows selected.

    3. La creación del sinónimo:

    SQL> create synonym regions for hr.regions;

    Synonym created.

    4. La consulta de la tabla a través del sinónimo:

    SQL> select *
    2 from regions
    3 where rownum drop synonym regions;

    Synonym dropped.

    6. Me conecto con el usuario HR:

    SQL> conn hr/hr
    Connected.

    7. Trato de crear un sinónimo para la misma tabla pero dentro de HR:

    SQL> create synonym regions for hr.regions;
    create synonym regions for hr.regions
    *
    ERROR at line 1:
    ORA-01471: no se puede crear un sin¾nimo con el mismo nombre que el objeto

    y voilá, el problema es que estás tratando de crear un sinónimo con el mismo nombre de la tabla dentro del mismo esquema, lo cual, no está permitido.

    Los sinónimos se crean en el usuario que quiere acceder a objetos en otro usuario, previos permisos, por lo que nunca te marcarán error estando conectado como el primero.

    Orlando.

  6. Belén says:

    Genial. Muy útil

  7. Orlando Olguín Olvera says:

    Hola Belén.

    Qué bueno que te ha servido.

    Orlando.

  8. fabian says:

    muchas gracias, no daba como crear los sinónimos sin que me saliera “insuficientes privilegios”. Esta información me ha sido de gran ayuda.

    ERROR at line 1:
    ORA-01031: insufficient privileges

    SQL> conn / as sysdba
    Connected.

    SQL> grant create synonym to prueba;
    Grant succeeded.

    SQL> conn prueba/prueba
    Connected.

    SQL> create synonym periodo for salt.periodo;
    Synonym created.

  9. Orlando Olguín Olvera says:

    Hola Fabián.

    Qué bueno que te ha sido útil la información.

    Orlando.

  10. Estudiante says:

    Buenas.

    Magnífico post y resolución de dudas.
    Me has aclarado todas mis incógnitas. Me ha servido de mucho. Muchas gracias. He visitado muchas páginas y hasta que no he llegado a ésta no lo he visto todo claro.
    Genial por poner todos los pasos en tus ejemplos.

    Un saludo

  11. Orlando Olguín Olvera says:

    Hola Estudiante.

    Gracias por tus comentarios y qué bueno que te fue de utilidad.

    Orlando.

  12. Francisco says:

    Gracias Orlando.

    Muy claro todo.

  13. Orlando Olguín Olvera says:

    Hola Francisco.

    Gracias por tu comentario.

    Orlando.

  14. alejandro says:

    Muchas gracias, está muy completa la información y muy bien explicada. Saludos.

  15. Orlando Olguín Olvera says:

    Hola Alejandro.

    Qué bueno que te ha sido de utilidad.

    Orlando.

  16. Rodrigo says:

    Estimado tengo una duda, uso un esquema que contiene solo sinonimos. Por lo tanto no puedo compilar objetos, eliminar o modificar tablas. El problema se me presenta en que no puedo ver los triggers ( el sinonimo si existe) o mejor dicho el sql de estos, de esta forma no tengo como comparar con respecto a mi ambiente de desarrollo.
    Lo segundo es muy parecido pero tiene que ver con el Body de los packages, solo puedo ver el spec en la iista de sinonimos pero el Body no lo veo.
    Como se puede hacer para q estos objetos me sean visibles en terminos de sql?
    No me interesa modificarlos.

    Atte,
    Rodrigo.

  17. Orlando Olguín Olvera says:

    Hola Rodrigo.

    Para el primer caso, ¿requieres ver el código del trigger?

    Porque en realidad, no requieres tener permiso a un trigger, basta con que tengas el permiso para insertar, borrar o actualizar la tabla asignada o el evento asignado si se trata de un trigger a nivel base de datos y el trigger hace el resto.

    Por otro lado, en el caso de los paquetes, cuando mencionas que sólo puedes ver el body, ¿es porque ves su código?

    Orlando.

  18. Rodrigo says:

    gracias Orlando por responder, centrémonos en el segundo caso.
    En realidad solo puedo ver el spec en la lista de sinónimos, el body no lo veo por ninguna parte.
    Es por eso que me gustaría saber como puedo hacer o que permisos deben darme para ver el body del package y así poder ver el sql asociado.
    Espero ser claro y no generar mas dudas :)

  19. Orlando Olguín Olvera says:

    Hola Rodrigo.

    Perdona pero he tenido mucho trabajo.

    Para ver y/o alterar cualquier paquete/procedimiento/función requieres el ALTER ANY PROCEDURE.

    Para crear un paquete/procedimiento/función en cualquier lado, CREATE ANY PROCEDURE.

    Orlando.

  20. Gente como tú hace que Internet sea tan útil.
    Gracias

  21. Orlando Olguín Olvera says:

    Hola Taarna.

    Muchas gracias por tu comentario, qué bueno que te haya sido de utilidad.

    Orlando.

  22. josue says:

    Hola,

    Tengo una duda, ¿es posible dar privilegios a un usuario A para crear sinonimos sobre un esquema B (es decir, A no es usuario del esquema B)?

  23. Orlando Olguín Olvera says:

    Hola Josué.

    Como lo mostré en el post, puedes crear los sinónimos sin problemas, mientras que tengas el privilegio respectivo sobre el objeto del otro usuario.

    Orlando.

  24. Alex Reina says:

    Excelente colega,

    Clara y precisa explicació que has brindado.

  25. Orlando Olguín Olvera says:

    Hola Alex.

    Qué bueno que te ha sido de utilidad.

    Orlando.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: