06 checks trigers
DESCRIPTION
ChecksTRANSCRIPT
UNIVERSIDAD REGIONAL AUTNOMADE LOS NDESUNIANDES IBARRAFACULTAD DE SISTEMAS MERCANTILESCARRERA DE SISTEMAS
BASE DE DATOS II
NIVEL: QUINTO SISTEMASESTUDIANTE:CHRISTIAN HERNAN SUREZWILSON ALEXIS MARQUEZDOCENTE: ING. RITA DAZIBARRA 2014 2015
TEMA: Base de datos transaccionalOBJETIVOS: Realizar consultas y transacciones en postgresql con checks y trigersFECHA: 04/11/2014
1. Las propiedades deben tener un valor > a 5000000 constraint propiedad_valor CHECK(valor>5000000);
2. El id de la propiedad debe ser > que el id de propietario constraint pr_ids CHECK(id_propiedad>id_propietario),
3. No se permite propiedades con la misma descripcin constraint pr_descrpcion UNIQUE(descripcion),
4. No se permite propiedades con 2 metros cuadrados con valores null
constraint pr_claves foreign key(idpropiedades) references propietarios(idpropie));
5. No se permite propietarios cuyo nombre sea Luis CONSTRAINT nombre CHECK (nombre 'luis'::text);
6. no se permite propietarios cuya edad < 18 y > 90 CONSTRAINT edad CHECK (edad < 18::numeric AND edad > 90::numeric);
7. apellidos propietarios se deben almacenar en mayuscula. CONSTRAINT mayus CHECK (apellido = upper(apellido))
8. Nombres propietarios se deben almacenar en minscula CONSTRAINT "minus" CHECK (nombre = lower(nombre))9. Salario de un secretario debe ser menor que el de un gerente CONSTRAINT salario CHECK (secretario_salario < gerente_salario);10. Realizar 2 ejercicios con trigers
Creamos una base de datos para utilizarla con nuestros ejemplos:
postgres@server:~$ psqlWelcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit
postgres=# CREATE DATABASE test001;CREATE DATABASE
postgres=# \c test001You are now connected to database "test001".
test001=# CREATE PROCEDURAL LANGUAGE plpgsql;Ahora creamos una tabla para poder definir nuestro primer disparador:CREATE TABLE numeros( numero bigint NOT NULL, cuadrado bigint, cubo bigint, raiz2 real, raiz3 real, PRIMARY KEY (numero));Despus tenemos que crear una funcin en PL/pgSQL para ser usada por nuestro disparador. Nuestra primera funcin es la ms simple que se puede definir y lo nico que har ser devolver el valor NULL:CREATE OR REPLACE FUNCTION proteger_datos() RETURNS TRIGGER AS $proteger_datos$ DECLARE BEGIN -- -- Esta funcion es usada para proteger datos en un tabla -- No se permitira el borrado de filas si la usamos -- en un disparador de tipo BEFORE / row-level --
RETURN NULL; END;$proteger_datos$ LANGUAGE plpgsql;A continuacin definimos en la tablanumerosun disparador del tipo BEFORE / row-level para la operacin DELETE. Ms adelante veremos como funciona:CREATE TRIGGER proteger_datos BEFORE DELETE ON numeros FOR EACH ROW EXECUTE PROCEDURE proteger_datos();La definicin de nuestra tabla ha quedado asi:test001=# \d numeros Table "public.numeros" Column | Type | Modifiers ----------+--------+----------- numero | bigint | not null cuadrado | bigint | cubo | bigint | raiz2 | real | raiz3 | real | Indexes: "numeros_pkey" PRIMARY KEY, btree (numero)Triggers: proteger_datos BEFORE DELETE ON numeros FOR EACH ROW EXECUTE PROCEDURE proteger_datos()
Creamos la tabla empleados.create table empleado( nom_emp text,sal_emp integer,\las_dat timestamp,las_use text);
Creamos la funcin para que no pueda insertar datos nulos en nombre ni salario y que se actualice la fecha automticamente con su respectivo usuario.
create or replace function emp() returns trigger as $emp$begin if new.nom_emp is null then raise exception 'no se inserto el nombre del empleado'; end if; if new.sal_emp is null then raise exception '%debe insertar un salario al empleado',new.sal_emp; end if;new.las_dat :=current_timestamp; new.las_use:=current_user;return new;end $emp$ language plpgsql;
Creamos un trigger con la funcin realizado anteriormente.
create trigger emp before insert or update on empleadofor each row execute procedure emp();
Realizamos una prueba de inserciones datos.
insert into empleado (nom_emp,sal_emp) values(suarez,121)
Actualizamos los datos.
update empleado setnom_emp=null,sal_emp=1000wherenom_emp ='christian'
CONCLUSIONES: Para realizar efectivamente condiciones o checks en postgreSQL es necesario realizar las mismas, con una sintaxis adecuada para evitar errores.RECOMENDACIONES: Se recomienda utilizar tanto el entorno grafico como el entorno de consola de postgreSQL para desarrollar condiciones.BIBLIOGRAFIA: Clases impartidas por la Ing. Rita Daz. Msc