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

¿Cómo crear un disparador para todas las tablas en postgresql?

Bueno, no hay creación de activadores para toda la base de datos, pero para todas esas operaciones de administración masiva, puede usar las tablas del sistema PostgreSQL para generar consultas en lugar de escribirlas a mano. En este caso, puede ejecutar:

SELECT
    'CREATE TRIGGER '
    || tab_name
    || ' BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();' AS trigger_creation_query
FROM (
    SELECT
        quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name
    FROM
        information_schema.tables
    WHERE
        table_schema NOT IN ('pg_catalog', 'information_schema')
        AND table_schema NOT LIKE 'pg_toast%'
) tablist;

Esto le dará un conjunto de cadenas que son comandos SQL como:

CREATE TRIGGER schema1.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table2 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table3 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2."TABLE2" BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
...
etc

Solo necesita ejecutarlos a la vez (ya sea por psql o pgAdmin).

Ahora alguna explicación:

  • Selecciono nombres de tablas en mi base de datos usando information_schema.tables tabla del sistema. Debido a que hay datos de literalmente todas las tablas, recuerde excluir pg_catalog y information_schema esquemas y tablas tostadas de su select .
  • Utilizo quote_ident(text) función que pondrá una cadena dentro de signos de comillas dobles ("" ) si es necesario (es decir, los nombres con espacios o letras mayúsculas lo requieren).
  • Cuando tengo una lista de nombres de tablas, simplemente los concateno con algunas cadenas estáticas para obtener mis comandos SQL.
  • Escribo ese comando usando una subconsulta porque quiero que tengas una mejor idea de lo que está pasando aquí. Puede escribir una sola consulta poniendo quote_ident(table_schema) || '.' || quote_ident(table_name) en lugar de tab_name .