Buenos días a todos.
He estado trabajando en mi aplicación con 4 tablas en Oracle siguiendo la convenciones de kumbiaphp y todo corre bien, desde el logueo hasta las consultas a las demás tablas. En mi archivo de configuración database tengo esto:
[development]
host = srv-aplicaciones
username = prueba
password = prueba
name = SIMA
type = oracle
Hasta ahora todo bien. Una vez comenté que en la empresa donde trabajo cada año crean un usuario nuevo con las mismas tablas y estructuras de datos, estas tablas contendrán la data de ese año. Mi problema comienza aquí. Ya que estaba trabajando con un usuario prueba, decidí comenzar a trabajar con el usuario actual, para esto cree mis tablas con la misma estructura y configuré el archivo database:
[development]
host = srv-aplicaciones
username = actual2011
password = actual2011
name = SIMA
type = oracle
El error que me muestra es el siguiente:
ActiveRecordException: No se ha definido una llave primaria para la tabla 'rolla' esto imposibilita crear el ActiveRecord para esta entidad (0)
En el archivo C:\Archivos de programa\Zend\Apache2\htdocs\08-03-2011\core\libs\db\active_record_base\active_record_base.php en la línea: 590
Si elimino o renombro en el usuario (esquema) prueba las tablas todo vuelve a funcionar bien.
¿Alguien tiene alguna idea de porqué este problema? Al parecer no pueden haber dos tablas con mismo nombre en usuarios (esquemas) diferentes.
Comentarios
por la excepción que se muestra se ve que no a definido una llave primaria en la tabla "No se ha definido una llave primaria para la tabla 'rolla' esto"
Problema resuelto.
Cuando se trabaja con mas de una tabla con mismo nombre en esquemas diferentes de oracle pasa lo comentado anteriormente. Donde se da el problema?
/**
* Soporta schemas? No
*/
Acá:
$describe = $this->fetch_all("SELECT LOWER(ALL_TAB_COLUMNS.COLUMN_NAME) AS FIELD, LOWER(ALL_TAB_COLUMNS.DATA_TYPE) AS TYPE, ALL_TAB_COLUMNS.DATA_LENGTH AS LENGTH, (SELECT COUNT(*) FROM ALL_CONS_COLUMNS WHERE TABLE_NAME = '".strtoupper($table)."' AND ALL_CONS_COLUMNS.COLUMN_NAME = ALL_TAB_COLUMNS.COLUMN_NAME AND ALL_CONS_COLUMNS.POSITION IS NOT NULL) AS KEY, ALL_TAB_COLUMNS.NULLABLE AS ISNULL FROM ALL_TAB_COLUMNS WHERE ALL_TAB_COLUMNS.TABLE_NAME = '".strtoupper($table)."'");
En la Línea 574 del método describe_table($table, $schema=''), del archivo oracle.php ubicado en: C:\wamp\www\SGA\core\libs\db\adapters\oracle.php
Mis modificaciones fueron:
- En la misma línea agregué algunas cosas en dos puntos diferentes:
AND ALL_TAB_COLUMNS.OWNER = '".strtoupper($schema)."'
Quedando de la siguiente manera:
$describe = $this->fetch_all("SELECT LOWER(ALL_TAB_COLUMNS.COLUMN_NAME) AS FIELD, LOWER(ALL_TAB_COLUMNS.DATA_TYPE) AS TYPE, ALL_TAB_COLUMNS.DATA_LENGTH AS LENGTH, (SELECT COUNT(*) FROM ALL_CONS_COLUMNS WHERE TABLE_NAME = '".strtoupper($table)."' AND ALL_CONS_COLUMNS.OWNER = '".strtoupper($schema)."' AND ALL_CONS_COLUMNS.COLUMN_NAME = ALL_TAB_COLUMNS.COLUMN_NAME AND ALL_CONS_COLUMNS.POSITION IS NOT NULL) AS KEY, ALL_TAB_COLUMNS.NULLABLE AS ISNULL FROM ALL_TAB_COLUMNS WHERE ALL_TAB_COLUMNS.TABLE_NAME = '".strtoupper($table)."' AND ALL_TAB_COLUMNS.OWNER = '".strtoupper($schema)."'");
Esto para que me tome en cuenta el esquema indicado en el momento de logueo, sin esta modificación aunque tenga todas mis tablas con mismo nombre en esquemas diferentes bien estructuradas (clave primaria) no funciona.
Además para indicar el esquema en cada uno de mis modelos uso el método:
public function initialize() {
$this->schema = Session::get("my_schema");
}
Cómo se ve en un paso previo (verificación de usuario) creo una variable de sesión llamada "my_schema"
No sé si es la mejor manera, pero funciona...
Luego de las modificaciones mencionadas arriba me di cuenta de que lo que me hacía antes (insersión) ya no me lo hacía, me dba error. Lo corregí de la siguiente manera:
[El error]
KumbiaException:
En el archivo C:\wamp\www\SGA\core\libs\db\adapters\oracle.php en la línea: 178
[Modificación]
En la línea 1730 de active_record_base.php
Línea original: $values[] = $this->source . "_id_seq.NEXTVAL";
Quedó así:
if ($this->schema) {
$values[] = $this->schema . "." . $this->source . "_id_seq.NEXTVAL";
} else {
$values[] = $this->source . "_id_seq.NEXTVAL";
}