我设置了一个小查询,使用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数据库的Postgres,没有访问配置文件。
Raise aNOTICE
:
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
格式。