En este artículo voy a explicar como crear sinónimos en Oracle y cómo asignar los permisos necesarios para que éstos sean leídos, alterados o eliminados.
Índice
¿Qué es un sinónimo?
Un sinónimo es un nombre alternativo para objetos como tablas, vistas, secuencias o procedimientos almacenados en la base de datos. Por norma general, los sinónimos se utilizan cuando quieres otorgar acceso a un objeto desde otro esquema, sin darle información a dicho usuario de quién es el propietario.
Cómo crear sinónimos en Oracle Database
Crear sinónimos en Oracle es muy sencillo, basta con utilizar la siguiente sentencia:
CREATE SYNONYM <NOMBRE_SINONIMO> FOR <ESQUEMA_PROPIETARIO>.<NOMBRE_OBJETO>;
Con esta sentencia podemos crear un sinónimo para cualquier objeto de la base de datos. Podemos hacerlo desde el mismo esquema o usuario que va a ser propietario del sinónimo o desde el usuario system de la base de datos (si este fuera el caso tendríamos que poner el nombre del esquema que va a ser propietario del sinónimo justo antes del nombre del sinónimo).
Tened en cuenta que el nombre del sinónimo puede ser el mismo que el del objeto al que estamos apuntando (siempre y cuando no exista ya en el nuevo esquema).
También podemos utilizar la coletilla público, para crear un sinónimo que pueda ser visto por todos los usuarios de Oracle:
CREATE PUBLIC SYNONYM <NOMBRE_SINONIMO> FOR <ESQUEMA_PROPIETARIO>.<NOMBRE_OBJETO>;
Por norma general yo desaconsejo utilizar esta sentencia, ya que solo es válida para casos muy específicos. Normalmente al crear un sinónimo lo que buscamos es que cierto esquema o usuario pueda ver cierta tabla, vista o secuencia y por ende no tiene sentido hacer un sinónimo que puedan consultar todos los usuarios.
Crear o reemplazar sinónimos
En ocasiones es probable que queramos actualizar sinónimos ya creados, en cuyo caso si intentamos lanzar la sentencia de creación de sinónimo nos devolverá un bonito error ORA-00955 advirtiéndonos que este nombre ya lo está utilizando otro objeto existente. El motivo, por supuesto, es que ya existe un sinónimo con ese nombre. Para evitar esta problemática yo siempre recomiendo lanzar la sentencia de la siguiente forma:
CREATE OR REPLACE SYNONYM <NOMBRE_SINONIMO> FOR <ESQUEMA_PROPIETARIO>.<NOMBRE_OBJETO>;
Añadiendo el or replace le decimos al motor de base de datos que cree o reemplace al sinónimo, de esta forma, si éste ya existiera previamente lo actualizaría, sin devolvernos ningún error.
Dar permisos (grants) para ese sinónimo
Con la creación del sinónimo no termina todo, ya que después tendremos que asignar los permisos que queremos brindar al usuario. Lo haremos de la siguiente forma:
GRANT SELECT ON <ESQUEMA_PROPIETARIO>.<NOMBRE_OBJETO> TO <ESQUEMA_PROPIETARIO_DEL_SINONIMO>;
De esta forma le diremos que el esquema o usuario propietario del sinónimo puede seleccionar (leer) la información que contiene el objeto del esquema propietario, ya que ahí es a donde apunta nuestro sinónimo. Podríamos darle más privilegios si quisiéramos, como por ejemplo:
GRANT INSERT, ALTER, DELETE, SELECT, UPDATE ON <ESQUEMA_PROPIETARIO>.<NOMBRE_OBJETO> TO <ESQUEMA_PROPIETARIO_DEL_SINONIMO>;
Así ya no solo podría leer la información sino también insertar datos, eliminarlos o actualizarlos.
Ejemplo práctico
Voy a poner un ejemplo muy sencillo. Imaginaos que en una base de datos tenemos dos esquemas y uno de ellos contiene una tabla llamada NINJA.
- ESQUEMA1
- NINJA
- ESQUEMA2
- (no contiene tablas)
Imaginemos que queremos que el ESQUEMA2 puede leer la información de la tabla NINJA cuyo propietario es el ESQUEMA1. Nos conectaríamos a la base de datos como system y lanzaríamos lo siguiente:
CREATE SYNONYM ESQUEMA2.NINJA FOR ESQUEMA1.NINJA;
GRANT SELECT ESQUEMA1.NINJA TO ESQUEMA2;
Con esto creamos un sinónimo para la tabla NINJA del ESQUEMA1 en el ESQUEMA2. Este sinónimo también se llama NINJA, como la tabla original de ESQUEMA1.
Documentación oficial
Todo esto que os he explicado yo aquí podéis encontrarlo en la documentación oficial de Oracle con más detalle. Os dejo los enlaces por si queréis indagar un poco más en el tema: