尝试在postgres中创建具有子块的脚本



我正在尝试创建这个脚本,如果它与当前数据库匹配,那么在子块内做一大块工作。因为这是我的第一次尝试,我不能让这个工作。任何想法吗?

DO
$do$
DECLARE
database CONSTANT text[] := array['prd1', 'prd2'];
BEGIN
IF current_database() = any(database)
THEN
**--execute the below sub block**
DECLARE
v_sql text;
BEGIN
v_sql :=
IF NOT EXISTS (
SELECT FROM pg_catalog.pg_roles  -- SELECT list can be empty for this
WHERE  rolname = 'dave') THEN
create role dave encrypted password 'md502bbddbc560b6470b360219ac95c13e2';
create schema authorization dave;
END IF;
END
);
-- end of sub block     

END IF;
END
$do$;

SQL Error [42601]: Error:语法错误在"NOT"位置:231

我想做的是在子块中做很多动作:

DO
$do$
DECLARE
database CONSTANT text[] := array['prd1', 'prd2'];
BEGIN
IF current_database() = any(database)
THEN
**--execute the below sub block**
DECLARE
v_sql text;
BEGIN
v_sql :=
IF NOT EXISTS (
SELECT FROM pg_catalog.pg_roles  -- SELECT list can be empty for this
WHERE  rolname = 'dave') THEN
create role dave encrypted password 'md502bbddbc560b6470b360219ac95c13e2';
create schema authorization dave;
END IF;
END

do 
$$ 
begin
execute format('grant connect, temporary  on database %I to %I', current_database(), 'user_monitor');
end;
$$;
CREATE OR REPLACE FUNCTION test.log_ddl()
RETURNS event_trigger AS $$
DECLARE
audit_query TEXT;
r RECORD;
BEGIN
[...]
END;
$$ LANGUAGE plpgsql;

**-- end of sub block**     
END IF;
END
$do$;
  1. 当您可以使用IF条件时,为什么要使用子块?2)为什么v_sql:=…?我认为将查询分配给变量没有意义。同样,您需要的只是根据IF条件执行CREATE操作。- - - - - -艾德里安·克拉弗

最新更新