miércoles, octubre 06, 2004

No usar palabras reservadas como identificador de nada

Ayer me pasó algo que me tuvo de cabeza varias horas. Estaba cargando un modelo de datos en Oracle (un 10g XE que instalé para tener en la oficina), y al momento de crear unos triggers para unos valores autonuméricos secuenciales, me arrojó un error para ciertas tablas.
CREATE SEQUENCE SEQ_tbl_password_ID INCREMENT BY 1 START WITH 1;

CREATE TABLE tbl_password(
pwd_id INTEGER NOT NULL,
usr_id INTEGER NOT NULL,
oldpassword VARCHAR2(32),
timestamp TIMESTAMP
);

ALTER TABLE tbl_password ADD PRIMARY KEY(pwd_id);

ALTER TABLE tbl_password ADD FOREIGN KEY(usr_id) REFERENCES tbl_user(usr_id);

CREATE INDEX idx_pwd_usr_id ON tbl_password(usr_id ASC);
Resultaba particularmente extraño pués todos los triggers tienen la misma estructura base. Un compañero de oficina me señaló que alguna vez tuvo un problema similar y se debía a que la estructura de la tabla tenía una palabra reservada en algún lado.

Efectivamente, si miran con atención, hay un campo de nombre "timestamp". Oracle no se hace mayores problemas al crear una tabla con campos cuyo nombre sea una palabra reservada, sin embargo por lo visto internamente SI restringe su uso.

Solución al problema: Cambiar el nombre del campo de manera que no sea una palabra reservada.

Es uno de esos problemas que uno no debiera tener, ya que normalmente nunca interesaria usar un campo con una palabra reservada como nombre, pero obviamente es un mero supuesto que hasta donde he logrado saber, no está 100% contemplado.