繁体   English   中英

如何从 pl/pgsql 调用 DROP USER?

[英]How to call DROP USER from pl/pgsql?

如何从 Pl/PgSql 调用DROP USER (见示例)?

CREATE PROCEDURE myfunc()
LANGUAGE PLPGSQL AS
$$
DECLARE
  super_users TEXT[];
  ldap_users TEXT[];
  u TEXT;
BEGIN
  super_users := ARRAY(SELECT usename::TEXT FROM pg_catalog.pg_user WHERE usesuper);
  ldap_users := ARRAY(SELECT uid::TEXT FROM ldap_users);

  FOREACH u IN ARRAY ldap_users LOOP
    IF (u <> 'postgres' AND u <> ALL(super_users)) THEN
      DROP USER IF EXISTS u;
    END IF;
  END LOOP;
END;
$$;

它会导致“角色 u 不存在”的错误...

恕我直言,PL/PGSQL 不将u视为变量,而是将其视为名称。 DROP USER...不是 SQL 而是一些扩展。 怎么做? 也许某些系统 function? 或者特殊的语法来代替u

编辑:我的解决方案(刚刚找到):

DECLARE
  stm TEXT;
  ...
BEGIN
  ...
  stm := 'DROP USER IF EXISTS "' || u '"';
  EXECUTE stm;
...

它似乎工作。 也许还有其他解决方案? 更规范?

为此,您需要动态 SQL

execute format('DROP USER IF EXISTS %I', u);

尝试这个:

DROP OWNED BY user;
DROP ROLE user;
DROP USER user;

这个对我有用。

Pd:检查SOF后,可以尝试:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM user;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM user;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM user;
DROP USER user;

队友的欢呼声。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM