删除postgres中共享相同前缀的所有表

Roy*_*Roy 16 sql postgresql dynamic-sql plpgsql

我想使用一个sql命令/查询从同一个数据库中删除所有共享相同前缀('supenh_agk')的表.

Erw*_*ter 27

要在一个命令中执行此操作,您需要EXECUTEDO语句(或函数)中使用动态SQL :

DO
$do$
DECLARE
   _tbl text;
BEGIN
FOR _tbl  IN
    SELECT quote_ident(table_schema) || '.'
        || quote_ident(table_name)      -- escape identifier and schema-qualify!
    FROM   information_schema.tables
    WHERE  table_name LIKE 'prefix' || '%'  -- your table name prefix
    AND    table_schema NOT LIKE 'pg\_%'    -- exclude system schemas
LOOP
   RAISE NOTICE '%',
-- EXECUTE
  'DROP TABLE ' || _tbl;  -- see below
END LOOP;
END
$do$;
Run Code Online (Sandbox Code Playgroud)

这包括当前用户可以访问的所有模式中的表.为安全起见,我排除了系统架构.

如果您没有正确地转义标识符,则代码将因任何需要双引号的非标准标识符而失败.
另外,您冒着允许SQL注入的风险.必须在动态代码中清理所有用户输入 - 包括用户可能提供的标识符.

潜在的危险!所有这些表都被丢弃了.我建在一个安全的地方.在实际执行之前检查生成的语句:注释RAISE并取消注释EXECUTE.

密切相关:

或者,您可以在目录表上构建,该目录表CASCADE还提供pg_class表格并且更快:

  'DROP TABLE ' || _tbl || ' CASCADE;
Run Code Online (Sandbox Code Playgroud)

系统目录或信息架构?

如何oid防御SQL注入?


Rya*_*ine 7

假设前缀是'sales_'

步骤1:获取具有该前缀的所有表名

SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'sales_%';
Run Code Online (Sandbox Code Playgroud)

第2步:单击"下载为CSV"按钮.

第3步:打开该文件的编辑和替换"sales_,销售"有空间

第4步: DROP TABLE sales_regist, sales_name, sales_info, sales_somthing;


归档时间:

查看次数:

12231 次

最近记录:

5 年,10 月 前