0

我设置了一个小查询,它使用 DO 块来动态编辑多个表。

DO
$$
DECLARE
    _table varchar[];
    loop_item text;
BEGIN
    SELECT array_agg(table_name::TEXT) FROM information_schema.tables 
    INTO _table
    WHERE table_schema = 'public';

FOREACH loop_item IN ARRAY "_table" 
LOOP
    IF loop_item != 'test' THEN     
        EXECUTE format('ALTER TABLE %s
        ADD COLUMN IF NOT EXISTS new_column varchar;', loop_item);
    END IF;
END LOOP;
END;
$$

如果未执行 EXECUTE 语句,则会打印一条通知。但我也想知道它何时成功执行。如何捕获并引发 EXECUTE 语句的返回消息?

信息:我正在使用 Azure Database for Postgres,无法访问配置文件。

4

1 回答 1

0

提高NOTICE

IF loop_item != 'test' THEN     
    EXECUTE format('ALTER TABLE %I
        ADD COLUMN IF NOT EXISTS new_column varchar;', loop_item);
    RAISE NOTICE 'Table %s altered', loop_item;
END IF;

您的原始代码容易受到 SQL 注入的影响,您应该使用该%I格式。

于 2021-10-01T14:31:58.790 回答