Re: [pgsql-es-ayuda] restriccion check
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
Pedro, hacelo con un trigger before update for each row El 5 de abril de 2017, 14:10, Francisco Olarteescribió: > 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
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
> >> 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
> 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
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
> 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
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
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.