Yii2: Utilizar tablas que pertenecen a otros esquemas en Oracle
Por amunoz el Domingo, 4 de Junio de 2017, 19:54 - Enlace permanente
Muchas veces durante el desarrollo nos encontramos con bases de datos con una arquitectura específica. En esta entrada vamos a ver cómo podemos utilizar objetos que pertenecen a otros esquemas a través del nuestro y que funcione bien con Yii2.
Lo primero que vamos a concretar son los esquemas que vamos a utilizar para el ejemplo, en este caso serán:
ESQUEMA1: será donde se creen la tabla del ejemplo. ESQUEMA2: será un usuario sin privilegios que sólo podrá utilizar las tablas del ESQUEMA1.
Por lo tanto en ESQUEMA1 ejecutaremos el siguiente script SQL:
CREATE TABLE TABLA1 ( ID NUMBER (10) PRIMARY KEY, NOMBRE VARCHAR2 (50) NOT NULL ); /* Creamos un sinónimo público que utilizará el otro esquema*/ CREATE PUBLIC SYNONYM TABLA1 FOR TABLA1; /* Le daremos permisos para hacer un CRUD en la tabla*/ GRANT SELECT, INSERT, UPDATE, DELETE ON TABLA1 TO ESQUEMA2;
Podremos comprobar desde ESQUEMA2 que podemos acceder a la tabla mediante:
SELECT * FROM TABLA1;
Ahora es el turno de Yii. Crearemos un proyecto básico nuevo y configuraremos la base de datos para que conecte a ESQUEMA2 y configuraremos el oci para que utilice un componente nuestro en lugar del componente por defecto de Yii. Quedaría algo así:
<?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'oci:dbname=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=SERVIDORORACLE)(PORT=1521))(CONNECT_DATA=(SID=ORCL)));' 'username' => 'ESQUEMA2', 'password' => 'ESQUEMA2', 'charset' => 'utf8', 'schemaMap' => [ 'oci'=> [ 'class'=>'app\components\OciMultiSchema', ] ], ];
Por lo tanto crearemos una carpeta "components" en la raíz del proyecto y dentro añadiremos el fichero adjunto en esta entrada. Lo que este fichero hace exactamente es una herencia de la clase original \yii\db\oci\Schema y sobreescribir los métodos que consultan los metadatos de las tablas, vistas, etc. añadiéndo vistas materializadas y sinónimos.
Además, como nuestro componente necesitará conocer quién es el "owner" de cada objeto que pertenecen a otros esquemas tendremos que definir en el fichero params.php un array con los objetos junto a su owner:
<?php return [ 'adminEmail' => '[email protected]', 'esquemas' => [ 'TABLA1' => 'ESQUEMA1', ], ];
Como podemos ver, ya podemos acceder a Gii y generar el modelo de nuestra tabla:
Nota: si nos da problemas al generar el CRUD por que le falta la clave primaria podéis modificar el modelo y añadirla manualmente:
public static function primaryKey(){ return ['ID']; }
Si accedemos a nuestro controlador/index podremos comenzar a hacer operaciones con nuestra tabla.