Pregunta

¿Es posible evitar la eliminación de la primera fila de la tabla en el lado de PostgreSQL?

Tengo una tabla de categorías y quiero evitar la eliminación de la categoría predeterminada, ya que podría dañar la aplicación. Por supuesto, podría hacerlo fácilmente en el código de la aplicación, pero sería mucho mejor hacerlo en la base de datos.

Creo que tiene algo que ver con las reglas sobre la declaración de eliminación, pero no pude encontrar nada remotamente cerca de mi problema en la documentación.

¿Fue útil?

Solución

La mejor manera que veo para lograr esto es creando un activador de eliminación en esta tabla. Básicamente, tendrá que escribir un procedimiento almacenado para asegurarse de que esta categoría 'predeterminada' siempre existirá, y luego aplicarla mediante un evento de activación EN ELIMINAR en esta tabla. Una buena forma de hacerlo es crear un activador por fila que garantice que en los eventos DELETE la fila de categoría 'predeterminada' nunca se eliminará.

Consulte la documentación de PostgreSQL sobre los desencadenantes y los procedimientos almacenados:

http://www.postgresql.org/docs/8.3 /interactive/trigger-definition.html

http://www.postgresql.org/docs/8.3/interactive /plpgsql.html

También hay ejemplos valiosos en este wiki:

http://wiki.postgresql.org/wiki/A_Brief_Real-world_Trigger_Example

Otros consejos

Tenías razón al pensar en el sistema de reglas. Aquí es un enlace a un ejemplo que coincide con su problema. Es incluso más simple que los desencadenantes:

create rule protect_first_entry_update as
  on update to your_table
  where old.id = your_id
  do instead nothing;
create rule protect_first_entry_delete as
  on delete to your_table
  where old.id = your_id
  do instead nothing;

Algunas respuestas pierden un punto: también la actualización de la fila protegida tiene que estar restringida. De lo contrario, primero se puede actualizar la fila protegida de modo que ya no cumpla con el criterio de eliminación prohibido, y luego se puede eliminar la fila actualizada ya que ya no está protegida.

Desea definir un ANTES DE BORRAR disparador en la tabla. Cuando intente eliminar la fila (ya sea que coincida con PK o tenga una columna booleana "proteger" separada, LEVANTAR una excepción.

No estoy familiarizado con la sintaxis de PostgreSQL, pero parece así es como lo harías:

CREATE FUNCTION check_del_cat() RETURNS trigger AS $check_del_cat$
    BEGIN            
        IF OLD.ID = 1 /*substitute primary key value for your row*/ THEN
            RAISE EXCEPTION 'cannot delete default category';
        END IF;

    END;
$check_del_cat$ LANGUAGE plpgsql;

CREATE TRIGGER check_del_cat BEFORE DELETE ON categories /*table name*/
    FOR EACH ROW EXECUTE PROCEDURE check_del_cat();

Podría tener una fila en otra tabla (llamada predeterminada) que haga referencia a la categoría predeterminada. La restricción FK no permitiría la eliminación de la categoría predeterminada.

Tenga en cuenta cómo funcionan los desencadenantes. Se dispararán por cada fila que su declaración de eliminación eliminará. Esto no significa que no deba usar disparadores, solo tenga esto en cuenta y, lo más importante, pruebe sus escenarios de uso y asegúrese de que el rendimiento cumpla con los requisitos.

¿Debo usar una regla o un activador?

De los documentos oficiales: " Para las cosas que ambos pueden implementar, lo mejor depende del uso de la base de datos. Se dispara un disparador para cualquier fila afectada una vez. Una regla manipula la consulta o genera una consulta adicional. Entonces, si muchas filas se ven afectadas en una declaración, es probable que una regla que emite un comando adicional sea más rápida que un activador que se llama para cada fila y debe ejecutar sus operaciones muchas veces. Sin embargo, el enfoque de activación es conceptualmente mucho más simple que el enfoque de reglas, y es más fácil para los novatos acertar ".

Vea los documentos para más detalles.
http://www.postgresql.org/docs/8.3/interactive/ rules-triggers.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top