buenas, tengo un pequeño problema en una tabla que estoy creando, necesito hacer una restriccion de un campo llamado fecha_inicio que sea menor que la fecha actual y no encuentro como ya que el sysdate veo que no me permite usarlo
gracias
| ||||
Respuesta: restriccion de una fecha la validación la debes hacer al momento que el usuario intente ingresar una fecha inferior. la haces desde la aplicación o desde una función en oracle haciendo uso de sysdate.
__________________ Without data, You are another person with an opinion. W. Edwads Deming |
| ||||
Respuesta: restriccion de una fecha El campo lo tengo de esta forma: proyectoFechaInicio date not null constraint p_fch_ck check (proyectoFechaInicio<=sysdate), pero me saca un error por la funcion del sistema............. |
| ||||
Respuesta: restriccion de una fecha Mira esta es la tb completa create table tbl_Proyectos( proyectoId number(8) constraint p_id_nn not null, proyectoDescripcion varchar2(30) constraint p_des_nn not null, proyectoClienteId number(12) constraint p_clid_nn not null, proyectoFechaInicio date not null constraint p_fch_ck check (proyectoFechaInicio<=sysdate), proyectoPresupuesto number(12) not null constraint p_pre_ck check (proyectoPresupuesto between 20000000 and 100000000), constraint p_cli_fk foreign key (proyectoClienteId)references tbl_clientes (clienteId), constraint p_des_uk unique (proyectoDescripcion), constraint p_id_pk primary key (proyectoId)); |
| ||||
Respuesta: restriccion de una fecha Hola que tal, No creo que puedas lograr eso con un check, lo que si podrias hacer es crear un trigger, validando que cada vez que se haga insert o update genere un error si la fecha es mayor a la actual. Algo asi
Código:
CREATE OR REPLACE TRIGGER trg_fecha BEFORE INSERT OR UPDATE ON Tbl_Proyectos BEGIN IF :ProyectoFechaInicio > SYSDATE THEN RAISE_APPLICATION_ERROR (num => -20000, msg => 'La fecha es mayor a la actual'); END IF; END; |
| ||||
Respuesta: restriccion de una fecha Parece que no se puede. Hice multiples pruebas sin ningún resultado. Asumo que el rango que se le da al ckeck constraint debe ser fijo y no permite la comparación con una función que es dinamica. Al hacer una prueba así:
Código sql:
Ver original De esta forma la tabla se crea correctamente. Esperemos los cometarios de Juan carlos para ver existe forma de hacer lo que quieres. Sin embargo, como te dije en el primer post, esto lo puedes controlar desde una función en plsql o desde la aplicación que tenga conexión a la base. saludos
__________________ Without data, You are another person with an opinion. W. Edwads Deming |
| |||
Respuesta: restriccion de una fecha Pues no, confundí las churras con las merinas, sorry. He buscado en el google y pone lo que has puesto tu, que es una funcion dinamica y oracle no te lo permite. En un foro he encontrado algo que puede servir, copio y pego : CREATE OR REPLACE TRIGGER trg_emp_dob BEFORE INSERT OR UPDATE ON emp BEGIN IF :new.dob > SYSDATE THEN RAISE_APPLICATION_ERROR (num => -20000, msg => 'DOB Cannot be in the future'); END IF; END; |
| ||||
Respuesta: restriccion de una fecha Aprovecho el aporte de 8vio y jc3000 para preguntarles acerca de los triggers que han puesto (Que son igualitos). El trigger se dispara antes de un insert o update. El raise_application_error interrumpe la ejecución del trigger una vez creado? En pocas palabras... si entra a este if, la inserción o la actualización se cancelan? Que pasaría si no fuera before sino after? Haría una especie de rollback? Por el concepto de triggers que manejo, pensé que esto no era posible.
__________________ Without data, You are another person with an opinion. W. Edwads Deming |
| ||||
Respuesta: restriccion de una fecha Bueno si por lo que veo es imposible hacerlo con una restriccion check......... Lo malo es que como todavia hemos visto el tema de los triggers no lo puedo hacer de esa manera........... Me tocara crearlo entonces con una fecha especifica...... De tdas formas Gracias a tdos!!! |
| |||
Respuesta: restriccion de una fecha Espera, que lo mismo se me ha encendido la bombilla. Huesos, el RAISE_APPLICATION_ERROR, es un un error forzado por programacion pero que oracle lo trata como cualquier error suyo, es decir, se va por la parte EXCEPTION y ahí tu puedes gestionar ese "error " especifico, simplemente pones un WHEN OTHERS o no pones nada y en este ultmo caso en la pantalla o editor de sql ta saltará el tipico error : ORA-XXXXX en linea X columna Y : " Fecha erronea " y en consecuencia si, te deshace todas las operaciones DML que has hecho y aborta la ejecucion. Un trigger es simplemente un PL que en lugar de ejecutarse " a peticion " como los pl's de BBDD , se ejcutan al hacer una operacion DML en la tabla. Sebas, prueba esto a ver si te vale, estoy en casa y lo hago de corrido, pero creo que puede valer : CREATE OR REPLACE TRIGGER trg_emp_dob BEFORE INSERT OR UPDATE ON emp declare var_fecha date; begin BEGIN select sysdate into var_fecha from dual; IF :new.dob > var_fecha THEN RAISE_APPLICATION_ERROR (num => -20000, msg => 'DOB Cannot be in the future'); END IF; END; end; |