2012-07-02 17 views
12

Para un diseño sensible a la seguridad, me gustaría deshabilitar DELETEs en ciertas tablas.¿Desea desactivar DELETE en la tabla en PostgreSQL?

El DELETE debería simplemente establecer un indicador deleted en una fila (que luego sería visible en una vista, que sería utilizada por la capa de aplicación).

Según tengo entendido, rule generaría consultas adicionales, por lo que una regla no podría suprimir la consulta original.

Como ilustración de un ejemplo de juguete con un gatillo (aún no probado):

-- data in this table should be 'undeletable' 
CREATE table article (
    id serial, 
    content text not null, 
    deleted boolean default false 
) 

-- some view that would only show articles, that are NOT deleted 
... 

-- toy trigger (not tested) 
CREATE OR REPLACE FUNCTION suppress_article_delete() 
RETURNS TRIGGER AS $sad$ 
BEGIN 
    IF (TG_OP = 'DELETE') THEN 
     UPDATE article SELECT id, content, TRUE; 
     -- NEW or NULL?? 
     RETURN NEW; 
    END IF; 
    RETURN NULL; 
END; 
$sad$ LANGUAGE plpgsql; 

lo que sería una buena manera de reprimir una DELETE?

Respuesta

15

Según entiendo una regla generaría consultas adicionales - por lo general no pudo reprimir la consulta original.

En realidad, no - que podría ser una regla INSTEAD:

CREATE RULE shoe_del_protect AS ON DELETE TO shoe DO INSTEAD NOTHING; 

(un ejemplo en esa misma página del manual).

Otra forma es eliminar REVOKE privilegios en la tabla en cuestión y crear procedimientos almacenados para eliminar ... y actualizar e insertar también probablemente.

+0

Gracias! Me gustaría obtener este diseño * undelete * en el modelo de datos, no en la administración (revocar), así que supongo que probaré una regla 'INSTEAD'. – miku

Cuestiones relacionadas