Blog dedicado a la programación y a la informática en general

Ir al contenido | Ir al menú | Ir a las búsquedas

Yii2: Utilizar tablas que pertenecen a otros esquemas en Oracle

logo_yii2_oracle.png

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. tablasindex.png

Attachments

Añadir un comentario

El código HTML se muestra como texto y las direcciones web se transforman automáticamente.

Discusiones sobre el mismo tema

URL de retroenlace : https://www.dosmweb.com/blog/index.php?trackback/16

Fuente de los comentarios de esta entrada