PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да създадете тригер за цялата таблица в postgresql?

Е, няма създаване на задействане за цялата база данни, но за всички подобни групови административни операции можете да използвате системни таблици на PostgreSQL, за да генерирате заявки за вас, вместо да ги пишете на ръка. В този случай можете да изпълните:

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;

Това ще ви даде набор от низове, които са SQL команди като:

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

Просто трябва да ги стартирате наведнъж (или чрез psql или pgAdmin).

Сега малко обяснение:

  • Избирам имена на таблици в моята база данни с помощта на information_schema.tables системна таблица. Тъй като има данни за буквално всички таблици, не забравяйте да изключите pg_catalog и information_schema схеми и тост таблици от вашите select .
  • Използвам quote_ident(text) функция, която ще постави низ в двойни кавички ("" ), ако е необходимо (т.е. имена с интервали или главни букви изискват това).
  • Когато имам списък с имена на таблици, просто ги свързвам с някои статични низове, за да получа моите SQL команди.
  • Пиша тази команда с помощта на подзаявка, защото искам да получите по-добра представа какво се случва тук. Можете да напишете една заявка, като поставите quote_ident(table_schema) || '.' || quote_ident(table_name) на мястото на tab_name .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Оптимизиране на заявка за преброяване за PostgreSQL

  2. Опресняването на материализиран изглед не включва добавена колона

  3. Как да свържете postgresql в hibernate.cfg.xml

  4. Какво да правим с нулеви стойности при моделиране и нормализиране?

  5. Грешка:pg_config изпълним файл не е намерен при инсталиране на psycopg2 на Alpine в Docker