You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redshift删除特定沙箱Schema外部表报错:无法在存储过程执行DROP EXTERNAL TABLE

解决Redshift存储过程中无法执行DROP EXTERNAL TABLE的问题

问题背景

需求:删除Redshift特定沙箱(singh_sandbox)中指定Schema(deleted)下的所有外部表。
编写存储过程后执行报错:

ERROR Exception: DROP EXTERNAL TABLE cannot be executed from a function or procedure

涉及的存储过程代码:

CREATE OR REPLACE PROCEDURE "workspace"."qw"()
AS
$$
DECLARE
	t_sql                      VARCHAR(32000);
	t_script_name              VARCHAR(100) := 'load_sample_dcdr$table_cleanup';
	t_table_name               VARCHAR(100);
	t_start_runtime             TIMESTAMP;
	t_row_count                  BIGINT;
	t_current_db_YYYYMM            VARCHAR;
	t_current_db            VARCHAR(100);
	cur_loop                   REFCURSOR;
BEGIN
--  IF UPPER(t_current_db) = UPPER(current_database()) THEN
	t_sql := 'select distinct(table_name) from svv_all_columns where schema_name=''deleted'' and database_name=''singh_sandbox''';

	OPEN cur_loop FOR EXECUTE t_sql;
       LOOP
        FETCH cur_loop INTO t_table_name;
        EXIT WHEN NOT FOUND;
             EXECUTE 'DROP  table IF EXISTS deleted.'||t_table_name||' cascade';
           
            t_row_count=t_row_count+1;

       END LOOP;
    CLOSE cur_loop;
--  END IF;
END;
$$ LANGUAGE plpgsql;

问题原因

Redshift的PL/pgSQL存储过程对部分DDL操作存在限制,DROP EXTERNAL TABLE属于受限操作,无法在存储过程内部通过EXECUTE语句执行。

替代解决方案

方案1:生成删除脚本手动执行

先运行以下查询,生成所有目标外部表的删除语句:

SELECT 'DROP EXTERNAL TABLE IF EXISTS deleted.' || table_name || ' CASCADE;'
FROM svv_all_columns 
WHERE schema_name = 'deleted' 
  AND database_name = 'singh_sandbox'
GROUP BY table_name;

将查询结果导出为SQL脚本,直接在Redshift客户端(如psql、DataGrip)中执行即可完成批量删除。

方案2:用脚本语言批量执行(以Python为例)

通过psycopg2连接Redshift,自动查询并删除目标表:

import psycopg2

# 配置Redshift连接参数
conn_params = {
    'dbname': 'your_database',
    'user': 'your_username',
    'password': 'your_password',
    'host': 'your_redshift_endpoint',
    'port': '5439'
}

# 建立连接并执行删除操作
conn = psycopg2.connect(**conn_params)
cur = conn.cursor()

# 查询所有需要删除的外部表
cur.execute("""
    SELECT DISTINCT table_name 
    FROM svv_all_columns 
    WHERE schema_name = 'deleted' 
      AND database_name = 'singh_sandbox'
""")

tables = cur.fetchall()

for (table_name,) in tables:
    drop_sql = f"DROP EXTERNAL TABLE IF EXISTS deleted.{table_name} CASCADE;"
    cur.execute(drop_sql)
    print(f"已删除表: deleted.{table_name}")

conn.commit()
cur.close()
conn.close()

方案3:使用AWS API自动化执行

通过AWS CLI调用Redshift的execute-statement接口,批量执行生成的删除语句,适合自动化运维场景。

内容的提问来源于stack exchange,提问作者Kartikeya Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:33:23