--- Crear la tabla jobs. --- un buena sugerencia sería tener una clave externa restrictiva --- con la tabla contact. create sequence Job_Sequence; drop table jobs; create table jobs ( job_id int4 unique DEFAULT nextval('Job_Sequence'), contact_id int4, job_no int4, job_name text, job_location text ); CREATE UNIQUE INDEX job_index ON jobs (job_name, contact_id); -- Esta es realmente una tabla auxiliar. -- Cada vez que ocurre un cambio lo inserta en esta tabla. -- Esto no se cumple para las eliminaciones sino para las inserciones y las actualizaciones. -- Esto es también una tabla historial no sólo auxiliar. -- Siempre guardamos la salida final. create sequence Backup_Job_Sequence; drop table jobs_backup; create table jobs_backup ( backup_id int4 unique DEFAULT nextval('Backup_Job_Sequence'), action text CHECK (action in ('insert','update','delete','')), error_code int4, job_id int4, contact_id int4, job_no int4, job_name text, job_location text ); create sequence Contact_Sequence; drop table contact; create table contact ( contact_id int4 UNIQUE DEFAULT nextval('Contact_Sequence'), name text unique, phone text, website text ); --- Inserta dos valores en contacts. --- No estoy creando procedimientos para esta tabla, únicamente para la tabla jobs. insert into contact (name,phone,website) values ('Mark Nielsen','(408) 891-6485','http://www.gnujobs.com'); insert into contact (name,phone,website) values ('Joe Shmoe','(1234) 111-1111','http://www.gnujobs.net'); insert into contact (name,phone,website) values ('Lolix.org','(12345) 111-1111','http://www.lolix.org'); --- Selecciona info de contact para ver si existe. select * from contact; --- Usaremos la función perl create (la cual probablemente no es necesaria) --- que verificará que los datos de entrada no están vacíos. drop function job_values_verify (int4,text,text); CREATE FUNCTION job_values_verify (int4,text,text) RETURNS int4 AS ' my $Contact_Id = shift; my $Job_Name = shift; my $Job_Description = shift; my $Error = 0; if ($Contact_Id < 1) {$Error = -100;} if (!($Job_Name =~ /[a-z0-9]/i)) {$Error = -101;} if (!($Job_Description =~ /[a-z0-9]/i)) {$Error = -102;} return $Error; ' LANGUAGE 'plperl'; drop function clean_text (text); CREATE FUNCTION clean_text (text) RETURNS text AS ' my $Text = shift; # Se eliminan los espacios en blanco del principio. $Text =~ s/^\\s+//; # Se eliminan los espacios en blanco del final. $Text =~ s/\\s+$//; # Se elimina cualquier cosa que no sea texto. $Text =~ s/[^ a-z0-9\\/\\`\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\-\\_\\=\\+\\\\\\|\\[\\{\\]\\}\\;\\:\\''\\"\\,\\<\\.\\>\\?\\t\\n]//gi; # Reemplaza todos los espacios múltiples por un único espacio. $Text =~ s/\\s+/ /g; return $Text; ' LANGUAGE 'plperl'; -- Simplemente muestra lo que esta función limpia. select clean_text (' ,./<>?aaa aa !@#$%^&*()_+| '); --