postgresql - 如何使用 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 文件。
解决方案
pg_dump
可能是这里最好的选择,因为它是与 Postgres 捆绑在一起的导出工具,旨在(或多或少)完全做到这一点。您指定的唯一要求是它特别要求某些对象类型(我假设这是一个严格的要求)。
pg_dump
确实有-s (--schema-only)
标志,它将create
为所有对象(不仅仅是表和触发器)转储所有语句。所以我想有2个选择:
- 倾倒整个事情,然后将其整理出来。我不太喜欢这个想法,因为您必须费力地编写各种不同 SQL 语句的开头/结尾的脚本,以便挑选出需要删除的内容。太乱了
- 编写一个脚本,
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
推荐阅读
- ruby-on-rails - 如何使用 Nokogiri 解析带有非对标签的 XML
- javascript - 从 phpadmin 中删除记录
- php - 如何从 PHP 中的关联数组构建多维数组树?
- android - 以编程方式为 ImageView 设置不同的角半径
- c# - 如何在 .net 核心中为 aws cognito Oauth2 替换 Claimsprincipal?
- matlab - x=[-300:1.1:300]'; 是什么意思?意思是?
- php - 从 curl 结果中获取一个值
- angular - ng命令的Mac问题
- android - 为什么下面的 OnboardingSupportFragment 在 android 中不起作用?
- c# - Winforms ComboBox 在没有表单父级时无法设置 SelectedIndex