sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Hay alguna manera de deshabilitar las actualizaciones/eliminaciones pero aún así permitir que los activadores las realicen?

Sí, esto es posible.

Los disparadores se ejecutan con los privilegios de la función de disparador, por defecto a SECURITY INVOKER lo que significa que la función de activación se ejecuta efectivamente con los privilegios del current_user , en su caso el que inserta filas.

Si el usuario actual no tiene los privilegios necesarios para las tablas en las que opera su función de activación, su operación original en la tabla subyacente fallará.

Sin embargo , puede utilizar SECURITY DEFINER para que la función de disparo haga que esta función se ejecute con los privilegios del OWNER de la función.

Si tiene un superusuario propio la función de activación, puede hacer todo - lo que sería un posible peligro para la seguridad. Considere las instrucciones en el manual sobre cómo escribir SECURITY DEFINER Funciona con seguridad.

Pero es más inteligente crear un rol simple con solo los privilegios necesarios OWNER de la función de disparo. Incluso puede simplemente crear un rol de "demonio" sin iniciar sesión, actuando como un paquete de privilegios para tales operaciones. Entonces otorgaría solo los privilegios necesarios (en esquemas, tablas, secuencias...) a este rol de daemon. Para diseños más sofisticados, debe agrupar privilegios en "roles de grupo" (nuevamente, sin inicio de sesión) y otorgar estos roles de grupo a los roles que lo necesitan (al rol de daemon en este ejemplo), convirtiéndolos efectivamente en "miembros del grupo". Lo hago mucho.

Considere esta respuesta relacionada en dba.SE con respecto a los privilegios de la función en sí:

  • ¿Cuáles son los privilegios necesarios para ejecutar una función de activación en PostgreSQL 8.4?