回答:
いかがですか
DROP USER <username>
これは実際にはのエイリアスですDROP ROLE
。
そのユーザーに関連付けられている特権を明示的に削除し、その所有権を他のロールに移動する(またはオブジェクトを削除する)必要があります。
これは、
REASSIGN OWNED BY <olduser> TO <newuser>
そして
DROP OWNED BY <olduser>
後者は、ユーザーに付与された特権を削除します。
DROP ROLEに関するpostgresのドキュメントと、この詳細については、こちらをご覧ください。
添加:
どうやら、ここで説明したコマンドを使用してユーザーを削除しようとしても、元のGRANTSが作成されたのと同じデータベースに接続しているときにそれらを実行している場合にのみ機能します。
受け入れられた回答により、REASSIGN OWNED BYまたはDROP OWNED BYを試行するとエラーが発生しました。以下は私のために働きました:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;
ユーザーは他のスキーマの権限を持っている可能性があります。その場合は、適切なREVOKE行を実行して、「public」を正しいスキーマに置き換えます。ユーザーのすべてのスキーマと権限タイプを表示するために、\ dpコマンドを編集して次のクエリを作成しました。
SELECT
n.nspname as "Schema",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'S' THEN 'sequence'
WHEN 'f' THEN 'foreign table'
END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';
TABLES、SEQUENCES、またはFUNCTIONSでの取り消しに対応する特権の種類はわかりませんが、それらはすべて3つのうちの1つに該当すると思います。
REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
revoke USAGE on SCHEMA some_schema from username;
REVOKEに1行追加する必要がありました...
実行後:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
私はまだエラーを受け取っていました: 一部のオブジェクトがそれに依存しているため、ユーザー名を削除できません詳細:スキーマパブリックの権限
私はこれを見逃していました:
REVOKE USAGE ON SCHEMA public FROM username;
それから私は役割を落とすことができました。
DROP USER username;
これが最終的に私のために働いたものです:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;
がないREVOKE ALL PRIVILEGES ON ALL VIEWS
ため、次で終了しました:
do $$
DECLARE r record;
begin
for r in select * from pg_views where schemaname = 'myschem'
loop
execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
end loop;
end $$;
そしていつも:
REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";
以下が成功するために:
drop role "XUSER";
私は同じ問題に直面し、今それを解決する方法を見つけました。まず、削除したいユーザーのデータベースを削除する必要があります。その後、ユーザーを簡単に削除できます。
私は「msf」という名前のユーザーを作成し、そのユーザーを削除して再作成するのにしばらく苦労しました。私は以下の手順に従って、成功しました。
1)データベースを削除する
dropdb msf
2)ユーザーをドロップする
dropuser msf
これで、ユーザーが正常に削除されました。
CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser
エラーメッセージが表示されました:ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo
。しかしながら、DROP OWNED BY testuser
トリックをしました、どうやらPostgresは許可をドロップ可能なオブジェクトであると考えています。