【发布时间】:2021-09-12 03:13:19
【问题描述】:
我正在尝试为(几乎)数据库中的所有表动态创建审计表。我可以动态生成适当的 SQL,如下所示:
SELECT
'CREATE TABLE IF NOT EXISTS '
|| tab_name || '_audit(timestamp TIMESTAMPTZ NOT NULL, entity JSONB NOT NULL);'
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;
这给了我一系列表格的行:
CREATE TABLE IF NOT EXISTS public.table1_audit(timestamp TIMESTAMPTZ NOT NULL, entity JSONB NOT NULL);
CREATE TABLE IF NOT EXISTS public.table2_audit(timestamp TIMESTAMPTZ NOT NULL, entity JSONB NOT NULL);
等等。
我正在努力解决的实际上是执行那些动态生成的查询。通过搜索 EXECUTE 似乎是必需的功能,但如果不产生语法错误或什么都不做,我无法让它工作。我希望能指出正确的方向。
【问题讨论】:
-
这是否回答了您的问题:dynamic sql query in postgres?
-
并非如此,在 EXECUTE 中包装会产生语法错误
-
如果您使用的是 psql,请不要使用 ;在 sql 语句的末尾运行 \gexec
-
就是这样,我实际上是在尝试将其写入 django 手动迁移,而不是通过 psql
标签: sql postgresql plpgsql dynamic-sql