Roy*_*Roy 16 sql postgresql dynamic-sql plpgsql
我想使用一个sql命令/查询从同一个数据库中删除所有共享相同前缀('supenh_agk')的表.
Erw*_*ter 27
要在一个命令中执行此操作,您需要EXECUTE
在DO
语句(或函数)中使用动态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注入?
假设前缀是'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 次 |
最近记录: |