Gilberto:

2017-04-05 18:46 GMT+02:00 Gilberto Castillo <gilberto.casti...@etecsa.cu>:
>>> 2017-04-05 16:46 GMT+02:00 Gilberto Castillo
>>> <gilberto.casti...@etecsa.cu>:
>>>>> 2017-04-05 16:22 GMT+02:00 Pedro PG <pedr...@outlook.com>:
>>>>>> 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

Responder a