Re: Problemas con un check

Lists: pgsql-es-ayuda
From: Luis A(dot) Zevallos Cárdenas <lzevallos(at)lobosistemas(dot)com>
To: posgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Problemas con un check
Date: 2009-05-20 20:25:15
Message-ID: ae5556ce0905201325v5419cbaej3c81fd90780bdae9@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola a todos

Una consulta con un check o como lo puedo manejar

tengo una tabla
CREATE TABLE tbl_paciente
(
paciente_persona_cod integer NOT NULL, -- Codigo de referencia hacia la
tabla persona
paciente_hstclinica_cod integer, -- Codigo que hace referencia a la tabla
de historia clinica
paciente_apoderado integer, -- Codigo de referencia a la tabla persona
para identificar al apoderado solo si es < de 14 años
)

Este paciente_apoderado como dice no tiene que ser null si la edad del
paciente es menor a 14

en la vista vw_paciente me da el campo edad

como podria manejar esto

ALTER TABLE "sch_clinica"."tbl_paciente"
ADD CONSTRAINT "tbl_paciente_chk" CHECK (case when (select p.edad from
vw_paciente p where p.cod=paciente_persona_cod)
is not null then(case when (select p.edad from vw_paciente p where
p.cod=paciente_persona_cod)<14
then paciente_apoderado is not null end )end);

Gracias por la ayuda

P.D. Claro manejar esto con la aplicacion se podria hacer en eso no hay
problemas....pero queria saber si se puede manejar a travez de la base de
datos

--
Luis Zevallos
DBA Administrador de DB & SRVR
Lobo Sistemas S.A.C
tel: +5154958310833
http://www.lobosistemas.com


From: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
To: "Luis A(dot) Zevallos" Cárdenas <lzevallos(at)lobosistemas(dot)com>
Cc: posgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problemas con un check
Date: 2009-05-20 20:41:14
Message-ID: 1242852074.5311.31.camel@gilbertoc.mtcorp.etecsa.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


El mié, 20-05-2009 a las 15:25 -0500, Luis A. Zevallos Cárdenas
escribió:
> Hola a todos
>
> Una consulta con un check o como lo puedo manejar
>
> tengo una tabla
> CREATE TABLE tbl_paciente
> (
> paciente_persona_cod integer NOT NULL, -- Codigo de referencia hacia
> la tabla persona
> paciente_hstclinica_cod integer, -- Codigo que hace referencia a la
> tabla de historia clinica
> paciente_apoderado integer, -- Codigo de referencia a la tabla
> persona para identificar al apoderado solo si es < de 14 años
> )
>
> Este paciente_apoderado como dice no tiene que ser null si la edad del
> paciente es menor a 14
>
> en la vista vw_paciente me da el campo edad
>
> como podria manejar esto
>
> ALTER TABLE "sch_clinica"."tbl_paciente"
> ADD CONSTRAINT "tbl_paciente_chk" CHECK (case when (select p.edad
> from vw_paciente p where p.cod=paciente_persona_cod)
> is not null then(case when (select p.edad from vw_paciente p where
> p.cod=paciente_persona_cod)<14
> then paciente_apoderado is not null end )end);
>
> Gracias por la ayuda
>
> P.D. Claro manejar esto con la aplicacion se podria hacer en eso no
> hay problemas....pero queria saber si se puede manejar a travez de la
> base de dato

No me queda claro lo que quieres hacer, pero puedes utilizar un trigger
o una regla que dispare cuando el la edad del paciente sea meyor ... de
14 y actualice en campo apoderado ...

--
Gilberto Castillo Martínez
Edificio Beijing. Miramar Trade Center. Etecsa.
La Habana, Cuba.


From: Jaime Casanova <jcasanov(at)systemguards(dot)com(dot)ec>
To: Luis A(dot) Zevallos Cárdenas <lzevallos(at)lobosistemas(dot)com>
Cc: posgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problemas con un check
Date: 2009-05-20 20:49:31
Message-ID: 3073cc9b0905201349w412aec9bt84fc845b4fe08706@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

2009/5/20 Luis A. Zevallos Cárdenas <lzevallos(at)lobosistemas(dot)com>:
> Hola a todos
>
> Una consulta con un check o como lo puedo manejar
>
> tengo una tabla
> CREATE TABLE tbl_paciente
> (
>   paciente_persona_cod integer NOT NULL, -- Codigo de referencia hacia la
> tabla persona
>   paciente_hstclinica_cod integer, -- Codigo que hace referencia a la tabla
> de historia clinica
>   paciente_apoderado integer, -- Codigo de referencia a la tabla persona
> para identificar al apoderado solo si es < de 14 años
> )
>
> Este paciente_apoderado como dice no tiene que ser null si la edad del
> paciente es menor a 14
>
> en la vista vw_paciente me da el campo edad
>

de donde saca la informacion esa vista? yo pensaria que de la misma
tabla tbl_paciente, si es asi quiza puedes hacer algo como:
CHECK ((paciente_edad < 14 AND paciente_apoderado IS NOT NULL) OR
(paciente_edad >= 14))

lo que segun yo solo permitira edades menores a 14 siempre que el
campo apoderado sea not null y permitira edades >= 14 sin
restriccion...

si el campo edad no sale de esta tabla sino de alguna otra entonces
puedes usar triggers para esto

--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Asesoría y desarrollo de sistemas
Guayaquil - Ecuador
Cel. +59387171157


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Luis A(dot) Zevallos Cárdenas <lzevallos(at)lobosistemas(dot)com>
Cc: posgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problemas con un check
Date: 2009-05-20 21:04:03
Message-ID: 20090520210403.GH5368@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Luis A. Zevallos Cárdenas escribió:
> Hola a todos
>
> Una consulta con un check o como lo puedo manejar
>
> tengo una tabla
> CREATE TABLE tbl_paciente
> (
> paciente_persona_cod integer NOT NULL, -- Codigo de referencia hacia la
> tabla persona
> paciente_hstclinica_cod integer, -- Codigo que hace referencia a la tabla
> de historia clinica
> paciente_apoderado integer, -- Codigo de referencia a la tabla persona
> para identificar al apoderado solo si es < de 14 años
> )
>
> Este paciente_apoderado como dice no tiene que ser null si la edad del
> paciente es menor a 14

No tiene mucho sentido esto -- ¿cómo vas a hacer que se vuelva NULL
cuando el paciente cumpla 14 años? Creo que la mejor manera de manejar
esto es en un trigger que exija que el paciente tenga apoderado al
momento de insertar, no una restricción en la columna misma.

(Detalle de implementación: no están permitidas las subconsultas en una
restricción CHECK. Obviamente puedes hacer trampa y ponerla en una
función)

--
Alvaro Herrera http://www.amazon.com/gp/registry/5ZYLFMCVHXC
"La libertad es como el dinero; el que no la sabe emplear la pierde" (Alvarez)


From: Luis A(dot) Zevallos Cárdenas <lzevallos(at)lobosistemas(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: posgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problemas con un check
Date: 2009-05-20 22:11:43
Message-ID: ae5556ce0905201511p722ad6cct850f855459579f7b@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola a todos

A ver no me deje entender bien creo

tengo una tabla que es tbl_persona en la cual tengo un campo fecha de
nacimiento
y cree una vista vw_persona en la cual con una funcion tengo mi campo edad

ahora en la tabla tbl_paciente
se relaciona con la vista vw_persona atravez del codigo osea
vw_persona.cod=tbl_paciente.paciente_persona_cod

LA RESTRICCION
Bien ahora lo que deseo es si un paciente es menor de 14 años entonces ese
campo
paciente_apoderado NO DEBE DE SER NULO y tendria que llenarse y hacer una
referencia a un codigo de la tabla persona

ya si un paciente es mayor de 14 años entonces PUEDE SER NULO

Gracias por responder

P.D. Probare con un trigger creo que con un before on insert funcionaria(Si
tienen otra idea bienvenida)

El 20 de mayo de 2009 16:04, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>escribió:

> Luis A. Zevallos Cárdenas escribió:
> > Hola a todos
> >
> > Una consulta con un check o como lo puedo manejar
> >
> > tengo una tabla
> > CREATE TABLE tbl_paciente
> > (
> > paciente_persona_cod integer NOT NULL, -- Codigo de referencia hacia la
> > tabla persona
> > paciente_hstclinica_cod integer, -- Codigo que hace referencia a la
> tabla
> > de historia clinica
> > paciente_apoderado integer, -- Codigo de referencia a la tabla persona
> > para identificar al apoderado solo si es < de 14 años
> > )
> >
> > Este paciente_apoderado como dice no tiene que ser null si la edad del
> > paciente es menor a 14
>
> No tiene mucho sentido esto -- ¿cómo vas a hacer que se vuelva NULL
> cuando el paciente cumpla 14 años? Creo que la mejor manera de manejar
> esto es en un trigger que exija que el paciente tenga apoderado al
> momento de insertar, no una restricción en la columna misma.
>
> (Detalle de implementación: no están permitidas las subconsultas en una
> restricción CHECK. Obviamente puedes hacer trampa y ponerla en una
> función)
>
> --
> Alvaro Herrera
> http://www.amazon.com/gp/registry/5ZYLFMCVHXC
> "La libertad es como el dinero; el que no la sabe emplear la pierde"
> (Alvarez)
>

--
Luis Zevallos
DBA Administrador de DB & SRVR
Lobo Sistemas S.A.C
tel: +5154958310833
http://www.lobosistemas.com