首页 > 解决方案 > 如何使用 pgAdmin4 为数据库中的所有触发器和表生成脚本

问题描述

我想生成一个包含 SQL 的 SQL 脚本,以创建我们数据库中存在的所有触发器和表。我已经尝试过右键单击表格的方法,选择script -> create Scripts. 虽然这会为表创建 SQL 脚本,但不会为该表的触发函数创建脚本。我应该怎么办?

我也试过:

SELECT tgrelid::regclass
     , tgname
     , pg_get_triggerdef(oid)
     , pg_get_functiondef(tgfoid)
FROM   pg_trigger
WHERE  tgrelid = 'public.tablename'::regclass;

但它没有用,因为它会创建一个 CSV 文件。

标签: postgresqlpgadminpostgresql-9.2pgadmin-4

解决方案


pg_dump可能是这里最好的选择,因为它是与 Postgres 捆绑在一起的导出工具,旨在(或多或少)完全做到这一点。您指定的唯一要求是它特别要求某些对象类型(我假设这是一个严格的要求)。

pg_dump确实有-s (--schema-only)标志,它将create为所有对象(不仅仅是表和触发器)转储所有语句。所以我想有2个选择:

  1. 倾倒整个事情,然后将其整理出来。我不太喜欢这个想法,因为您必须费力地编写各种不同 SQL 语句的开头/结尾的脚本,以便挑选出需要删除的内容。太乱了
  2. 编写一个脚本,pg_dump仅包装和预选触发器和表。让脚本用于psql查询 Postgres 系统表以获取所有对象table的名称。trigger然后将该列表输入pg_dump以单独导出每个对象。

选项 2 听起来更容易,但也更慢,因为我认为触发器可能需要一个接一个地完成(可以使用-t (--table=TABLE)to 选项批量完成表格pg_dump)。但由于它只是转储模式对象而没有数据,它可能不会产生很大的影响。

您可以像这样选择触发器:

pg_dump -s -Fc | pg_restore --trigger='my_trigger'

这可以包含在一个脚本中:

#!/bin/bash

my_db='db_name'

triggers=($(psql --dbname="${my_db}" -A -R ', ' -t \
            -c 'select tgname from pg_trigger'))

for trigger in "${triggers[@]}"; do
  pg_dump -s -Fc | pg_restore --trigger="$trigger"
done

推荐阅读