Re: [pgsql-es-ayuda] restriccion check

2017-04-07 Por tema Alvaro Herrera
Guillermo E. Villanueva escribió:
> Pedro, hacelo con un trigger before update for each row

Es lo que dijo Francisco en su primera respuesta, y concuerdo en que es
la forma correcta.

-- 
Álvaro Herrerahttps://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [MASSMAIL]Re: [pgsql-es-ayuda] restriccion check

2017-04-06 Por tema Guillermo E. Villanueva
Pedro, hacelo con un trigger before update for each row

El 5 de abril de 2017, 14:10, Francisco Olarte 
escribió:

> Gilberto:
>
> 2017-04-05 18:46 GMT+02:00 Gilberto Castillo  >:
> >>> 2017-04-05 16:46 GMT+02:00 Gilberto Castillo
> >>> :
> > 2017-04-05 16:22 GMT+02:00 Pedro PG :
> >> Lo que deseo es agregar una restriccion CHECK que solo permita
> >> modificar
> >> datos de la tupla si y solo si liquidado es NULL.
> >
> > Igual estoy un poco oxidado, pero las restricciones check lo que
> hacen
> > es comprobar un juego de valores de la tupla, no miran si vienen de
> > update o de lo que sea.
> >
> >> 1) Cuando se inserta un registro el campo liquidado siempre sera
> NULL
> >> (esto
> >> es correcto).
> >> 2) Desde un procedimiento externo actualizare liquidado (esto
> tambien
> >> es
> >> correcto).
> >> 3) Si deseo actualizar el registro, solo debe permitirme si el campo
> >> liquidado es NULL (aqui mi problema).
> >
> > Probablemente puedes hacer eso con un trigger. De todas formas, salvo
> > que estes haciendo el control con roles y mucho cuidado, porque no
> > pones un 'where liquidadoull' extra en los updates? Tambien podrias
> > probar con un "create rule x on update to table where OLD.liquidado
> is
> > not null instead do nothing' o algo asi, pero te puede dar problemas
> > si quieres revertir una fila a liquidadoull. Al fin y al cabo, si
> > alguien puede cambiar liquidado a null probablemente pueda hacer
> > not-null->null->update->null.
> 
>  Yo Usaría UPSERT
> >>>
> >>> Iluminanos, porfa. Hacer eso con upsert seria un truco fantastico.
> >
> > insert into mytabla as a (campo1, liquidado)
> > values ('valor1',1),('valor2',null)
> > on conflict (liquidado)
> > do update set
> > liquidado = a.liquidado + EXCLUDED.liquidado
> >  where a.liquidado IS NULL;
>
> Te tomaste la molestia de leer un poco por encima lo que pedia?
>
> Suponiendo que asi fuera ( que yo personalmente creo que no pero
> siempre hay que otorgar el beneficio de la duda):
>
> 1.- Su problema es evitar updates, no inserts., lo pone en el punto 3.
>
> 2.- Y aunque no insertase siempre null, el campo de liquidado NO es unico.
>
> 3.- De hecho el punto 1 de la pregunta dice que insert SIEMPRE es null
> en insercion, lo que hace que NUNCA haya conflictos de insercion en
> liquidado.
>
> Francisco Olarte.
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>


Re: [MASSMAIL]Re: [pgsql-es-ayuda] restriccion check

2017-04-05 Por tema Francisco Olarte
Gilberto:

2017-04-05 18:46 GMT+02:00 Gilberto Castillo :
>>> 2017-04-05 16:46 GMT+02:00 Gilberto Castillo
>>> :
> 2017-04-05 16:22 GMT+02:00 Pedro PG :
>> Lo que deseo es agregar una restriccion CHECK que solo permita
>> modificar
>> datos de la tupla si y solo si liquidado es NULL.
>
> Igual estoy un poco oxidado, pero las restricciones check lo que hacen
> es comprobar un juego de valores de la tupla, no miran si vienen de
> update o de lo que sea.
>
>> 1) Cuando se inserta un registro el campo liquidado siempre sera NULL
>> (esto
>> es correcto).
>> 2) Desde un procedimiento externo actualizare liquidado (esto tambien
>> es
>> correcto).
>> 3) Si deseo actualizar el registro, solo debe permitirme si el campo
>> liquidado es NULL (aqui mi problema).
>
> Probablemente puedes hacer eso con un trigger. De todas formas, salvo
> que estes haciendo el control con roles y mucho cuidado, porque no
> pones un 'where liquidadoull' extra en los updates? Tambien podrias
> probar con un "create rule x on update to table where OLD.liquidado is
> not null instead do nothing' o algo asi, pero te puede dar problemas
> si quieres revertir una fila a liquidadoull. Al fin y al cabo, si
> alguien puede cambiar liquidado a null probablemente pueda hacer
> not-null->null->update->null.

 Yo Usaría UPSERT
>>>
>>> Iluminanos, porfa. Hacer eso con upsert seria un truco fantastico.
>
> insert into mytabla as a (campo1, liquidado)
> values ('valor1',1),('valor2',null)
> on conflict (liquidado)
> do update set
> liquidado = a.liquidado + EXCLUDED.liquidado
>  where a.liquidado IS NULL;

Te tomaste la molestia de leer un poco por encima lo que pedia?

Suponiendo que asi fuera ( que yo personalmente creo que no pero
siempre hay que otorgar el beneficio de la duda):

1.- Su problema es evitar updates, no inserts., lo pone en el punto 3.

2.- Y aunque no insertase siempre null, el campo de liquidado NO es unico.

3.- De hecho el punto 1 de la pregunta dice que insert SIEMPRE es null
en insercion, lo que hace que NUNCA haya conflictos de insercion en
liquidado.

Francisco Olarte.

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [MASSMAIL]Re: [pgsql-es-ayuda] restriccion check

2017-04-05 Por tema Gilberto Castillo

>
>> Gilberto:
>>
>> 2017-04-05 16:46 GMT+02:00 Gilberto Castillo
>> :
 2017-04-05 16:22 GMT+02:00 Pedro PG :
> Lo que deseo es agregar una restriccion CHECK que solo permita
> modificar
> datos de la tupla si y solo si liquidado es NULL.

 Igual estoy un poco oxidado, pero las restricciones check lo que hacen
 es comprobar un juego de valores de la tupla, no miran si vienen de
 update o de lo que sea.

> 1) Cuando se inserta un registro el campo liquidado siempre sera NULL
> (esto
> es correcto).
> 2) Desde un procedimiento externo actualizare liquidado (esto tambien
> es
> correcto).
> 3) Si deseo actualizar el registro, solo debe permitirme si el campo
> liquidado es NULL (aqui mi problema).

 Probablemente puedes hacer eso con un trigger. De todas formas, salvo
 que estes haciendo el control con roles y mucho cuidado, porque no
 pones un 'where liquidadoull' extra en los updates? Tambien podrias
 probar con un "create rule x on update to table where OLD.liquidado is
 not null instead do nothing' o algo asi, pero te puede dar problemas
 si quieres revertir una fila a liquidadoull. Al fin y al cabo, si
 alguien puede cambiar liquidado a null probablemente pueda hacer
 not-null->null->update->null.
>>>
>>> Yo Usaría UPSERT
>>
>> Iluminanos, porfa. Hacer eso con upsert seria un truco fantastico.

insert into mytabla as a (campo1, liquidado)
values ('valor1',1),('valor2',null)
on conflict (liquidado)
do update set
liquidado = a.liquidado + EXCLUDED.liquidado
 where a.liquidado IS NULL;

-- 
Saludos,
Gilberto Castillo
ETECSA, La Habana, Cuba


-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [MASSMAIL]Re: [pgsql-es-ayuda] restriccion check

2017-04-05 Por tema Gilberto Castillo

> Gilberto:
>
> 2017-04-05 16:46 GMT+02:00 Gilberto Castillo
> :
>>> 2017-04-05 16:22 GMT+02:00 Pedro PG :
 Lo que deseo es agregar una restriccion CHECK que solo permita
 modificar
 datos de la tupla si y solo si liquidado es NULL.
>>>
>>> Igual estoy un poco oxidado, pero las restricciones check lo que hacen
>>> es comprobar un juego de valores de la tupla, no miran si vienen de
>>> update o de lo que sea.
>>>
 1) Cuando se inserta un registro el campo liquidado siempre sera NULL
 (esto
 es correcto).
 2) Desde un procedimiento externo actualizare liquidado (esto tambien
 es
 correcto).
 3) Si deseo actualizar el registro, solo debe permitirme si el campo
 liquidado es NULL (aqui mi problema).
>>>
>>> Probablemente puedes hacer eso con un trigger. De todas formas, salvo
>>> que estes haciendo el control con roles y mucho cuidado, porque no
>>> pones un 'where liquidadoull' extra en los updates? Tambien podrias
>>> probar con un "create rule x on update to table where OLD.liquidado is
>>> not null instead do nothing' o algo asi, pero te puede dar problemas
>>> si quieres revertir una fila a liquidadoull. Al fin y al cabo, si
>>> alguien puede cambiar liquidado a null probablemente pueda hacer
>>> not-null->null->update->null.
>>
>> Yo Usaría UPSERT
>
> Iluminanos, porfa. Hacer eso con upsert seria un truco fantastico.

insert into mytabla as a (campo1, liquidado)
values ('valor1',1),('valor2',null)
on conflict (liquidado)
do update set
liquidado = a.liquidado + EXCLUDED.liquidado
where a.liquidado NOT NULL;


No lo probé, pero esa es la idea.
-- 
Saludos,
Gilberto Castillo
ETECSA, La Habana, Cuba


-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [MASSMAIL]Re: [pgsql-es-ayuda] restriccion check

2017-04-05 Por tema Francisco Olarte
Gilberto:

2017-04-05 16:46 GMT+02:00 Gilberto Castillo :
>> 2017-04-05 16:22 GMT+02:00 Pedro PG :
>>> Lo que deseo es agregar una restriccion CHECK que solo permita modificar
>>> datos de la tupla si y solo si liquidado es NULL.
>>
>> Igual estoy un poco oxidado, pero las restricciones check lo que hacen
>> es comprobar un juego de valores de la tupla, no miran si vienen de
>> update o de lo que sea.
>>
>>> 1) Cuando se inserta un registro el campo liquidado siempre sera NULL
>>> (esto
>>> es correcto).
>>> 2) Desde un procedimiento externo actualizare liquidado (esto tambien es
>>> correcto).
>>> 3) Si deseo actualizar el registro, solo debe permitirme si el campo
>>> liquidado es NULL (aqui mi problema).
>>
>> Probablemente puedes hacer eso con un trigger. De todas formas, salvo
>> que estes haciendo el control con roles y mucho cuidado, porque no
>> pones un 'where liquidado=null' extra en los updates? Tambien podrias
>> probar con un "create rule x on update to table where OLD.liquidado is
>> not null instead do nothing' o algo asi, pero te puede dar problemas
>> si quieres revertir una fila a liquidado=null. Al fin y al cabo, si
>> alguien puede cambiar liquidado a null probablemente pueda hacer
>> not-null->null->update->null.
>
> Yo Usaría UPSERT

Iluminanos, porfa. Hacer eso con upsert seria un truco fantastico.

Francisco Olarte.

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [MASSMAIL]Re: [pgsql-es-ayuda] restriccion check

2017-04-05 Por tema Gilberto Castillo

> Pedro:
>
> 2017-04-05 16:22 GMT+02:00 Pedro PG :
>> Lo que deseo es agregar una restriccion CHECK que solo permita modificar
>> datos de la tupla si y solo si liquidado es NULL.
>
> Igual estoy un poco oxidado, pero las restricciones check lo que hacen
> es comprobar un juego de valores de la tupla, no miran si vienen de
> update o de lo que sea.
>
>> 1) Cuando se inserta un registro el campo liquidado siempre sera NULL
>> (esto
>> es correcto).
>> 2) Desde un procedimiento externo actualizare liquidado (esto tambien es
>> correcto).
>> 3) Si deseo actualizar el registro, solo debe permitirme si el campo
>> liquidado es NULL (aqui mi problema).
>
> Probablemente puedes hacer eso con un trigger. De todas formas, salvo
> que estes haciendo el control con roles y mucho cuidado, porque no
> pones un 'where liquidado=null' extra en los updates? Tambien podrias
> probar con un "create rule x on update to table where OLD.liquidado is
> not null instead do nothing' o algo asi, pero te puede dar problemas
> si quieres revertir una fila a liquidado=null. Al fin y al cabo, si
> alguien puede cambiar liquidado a null probablemente pueda hacer
> not-null->null->update->null.

Yo Usaría UPSERT

-- 
Saludos,
Gilberto Castillo
ETECSA, La Habana, Cuba


-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [pgsql-es-ayuda] restriccion check

2017-04-05 Por tema Francisco Olarte
Pedro:

2017-04-05 16:22 GMT+02:00 Pedro PG :
> Lo que deseo es agregar una restriccion CHECK que solo permita modificar
> datos de la tupla si y solo si liquidado es NULL.

Igual estoy un poco oxidado, pero las restricciones check lo que hacen
es comprobar un juego de valores de la tupla, no miran si vienen de
update o de lo que sea.

> 1) Cuando se inserta un registro el campo liquidado siempre sera NULL (esto
> es correcto).
> 2) Desde un procedimiento externo actualizare liquidado (esto tambien es
> correcto).
> 3) Si deseo actualizar el registro, solo debe permitirme si el campo
> liquidado es NULL (aqui mi problema).

Probablemente puedes hacer eso con un trigger. De todas formas, salvo
que estes haciendo el control con roles y mucho cuidado, porque no
pones un 'where liquidado=null' extra en los updates? Tambien podrias
probar con un "create rule x on update to table where OLD.liquidado is
not null instead do nothing' o algo asi, pero te puede dar problemas
si quieres revertir una fila a liquidado=null. Al fin y al cabo, si
alguien puede cambiar liquidado a null probablemente pueda hacer
not-null->null->update->null.


Francisco Olarte.

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


[pgsql-es-ayuda] restriccion check

2017-04-05 Por tema Pedro PG
Hola grupo, tengo una consulta.

Tengo la siguiente tabla:


* tb_version (id serial, dato1 int, dato2 int, liquidado int)


Lo que deseo es agregar una restriccion CHECK que solo permita modificar datos 
de la tupla si y solo si liquidado es NULL.


1) Cuando se inserta un registro el campo liquidado siempre sera NULL (esto es 
correcto).

2) Desde un procedimiento externo actualizare liquidado (esto tambien es 
correcto).

3) Si deseo actualizar el registro, solo debe permitirme si el campo liquidado 
es NULL (aqui mi problema).


Gracias desde ya.

Saludos.