はじめに
通常、ユーザを削除すると、そのユーザーが所有するオブジェクトも削除されます。
しかし、本稿でご紹介する方法を用いれば、ユーザーを削除してもオブジェクトを残すことが可能です。
概要
ユーザ削除時に、削除対象ユーザが所有するオブジェクトを別のユーザの所有オブジェクトへと自動的に変更することができます。
この方法は、以降で説明するパラメータにユーザを設定することで有効になります。
パラメータに設定するユーザは、オブジェクトの新たな所有者となるユーザを設定します。
パラメータ
下記のパラメータにユーザを設定します。
GlobalHeirUsername = ‘値’
パラメータに設定する値の内容は以下になります。
| 値 | 内容 |
|---|---|
| <auto> | デフォルトの値。 削除されたLDAPユーザのオブジェクトをdbadminユーザに所有を変更します。 LDAPユーザでないユーザを削除した場合、ユーザのオブジェクトは削除されます。 |
| 空文字 | 削除されたユーザのオブジェクトは削除されます。 |
| ユーザ名 | 削除されたユーザのオブジェクトは、設定されたユーザに所有を変更します。 設定されたユーザが存在しない場合は、ユーザを作成して所有を変更します。 |
実行例
【存在するユーザをパラメータに設定して、ユーザを削除した場合】
■ユーザの確認
dbadmin=> \du
List of users
User name | Is Superuser
-----------+--------------
dbadmin | t
usr1 | f
usr2 | f
(3 rows)
■テーブルのオーナーを確認
dbadmin=> \dt
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+-------+---------
usr1 | tbl1 | table | usr1 | ★ tbl1のOwnerがusr1で作成されています
(1 row)
■テーブルを検索
dbadmin=> select * from usr1.tbl1;
a
---
1
2
3
(3 rows)
■"GlobalHeirUsername"パラメータの設定
dbadmin=> ALTER DATABASE DEFAULT SET PARAMETER GlobalHeirUsername='usr2'; ★既存ユーザ名を設定
ALTER DATABASE
■"GlobalHeirUsername"パラメータの確認
dbadmin=> select parameter_name,current_value from configuration_parameters where parameter_name ilike '%GlobalHeirUsername%';
parameter_name | current_value
--------------------+---------------
GlobalHeirUsername | usr2
(1 row)
■ユーザを削除
dbadmin=> drop user usr1 cascade;
DROP USER
■ユーザの確認
dbadmin=> \du
List of users
User name | Is Superuser
-----------+--------------
dbadmin | t
usr2 | f
(2 rows)
■テーブルのオーナーを確認
dbadmin=> \dt
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+-------+---------
usr1 | tbl1 | table | usr2 | ★ tbl1のOwnerがusr1からusr2に変更されています
(1 row)
■オブジェクトのオーナーが変更になったことを確認
ユーザ削除でオーナーが変更になったオブジェクトは、システムテーブル"reparented_on_drop”で確認できます。
dbadmin=> select schema_name,obj_name,old_owner_name,new_owner_name from reparented_on_drop;
schema_name | obj_name | old_owner_name | new_owner_name
-------------+----------+----------------+----------------
usr1 | tbl1 | usr1 | usr2 ★ tbl1のOwnerがusr1からusr2に変更されています
■テーブルを検索
dbadmin=> select * from usr1.tbl1;
a
---
1
2
3
(3 rows)【存在しないユーザをパラメータに設定して、ユーザを削除した場合】
■ユーザの確認
dbadmin=> \du
List of users
User name | Is Superuser
-----------+--------------
dbadmin | t
usr1 | f
usr2 | f
(3 rows)
■テーブルオーナーを確認
dbadmin=> \dt
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+-------+---------
usr1 | tbl1 | table | usr1 | ★ tbl1のOwnerがusr1で作成されています
(1 row)
■テーブルを検索
dbadmin=> select * from usr1.tbl1;
a
---
1
2
3
(3 rows)
■"GlobalHeirUsername"パラメータの設定
dbadmin=> ALTER DATABASE DEFAULT SET PARAMETER GlobalHeirUsername='usr3'; ★存在しないユーザ名を設定
ALTER DATABASE
■"GlobalHeirUsername"パラメータの確認
dbadmin=> select parameter_name,current_value from configuration_parameters where parameter_name ilike '%GlobalHeirUsername%';
parameter_name | current_value
--------------------+---------------
GlobalHeirUsername | usr3
(1 row)
■ユーザを削除
dbadmin=> drop user usr1 cascade;
DROP USER
■ユーザの確認
dbadmin=> \du
List of users
User name | Is Superuser
-----------+--------------
dbadmin | t
usr2 | f
usr3 | f ★usr3が作成されています
(3 rows)
■テーブルのオーナーを確認
dbadmin=> \dt
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+-------+---------
usr1 | tbl1 | table | usr3 | ★ tbl1のOwnerがusr1からusr3に変更されています
(1 row)
■オブジェクトのオーナーが変更になったことを確認
dbadmin=> select schema_name,obj_name,old_owner_name,new_owner_name from reparented_on_drop;
schema_name | obj_name | old_owner_name | new_owner_name
-------------+----------+----------------+----------------
usr1 | tbl1 | usr1 | usr3 ★ tbl1のOwnerがusr1からusr3に変更されています
■テーブルを検索
dbadmin=> select * from usr1.tbl1;
a
---
1
2
3
(3 rows)
■ユーザのロック解除
パラメータに存在しないユーザを指定した場合、自動的にユーザが作成されますが、
ロックされているため接続することができません。
自動的に作成されたユーザに接続する場合は、以下のコマンドでユーザのロックを解除してください。
dbadmin=> alter user usr3 account unlock;
ALTER USER注意事項
・ユーザ削除時にオブジェクトの所有者は変更されますが、変更後のユーザにスキーマの権限付与はされないため、手動で権限付与を行ってください。
・パラメータに設定したユーザを削除しようとすると、以下のエラーが発生してユーザを削除することができません。
ユーザの削除は、パラメータに設定したユーザを変更してから行ってください。
dbadmin=> drop user usr3 cascade;
ROLLBACK 6676: Cannot drop global heir user “usr3”. Try changing / clearing the GlobalHeirUsername config parameter
ROLLBACK 6676: Cannot drop global heir user “usr3”. Try changing / clearing the GlobalHeirUsername config parameter
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。
更新履歴
2019/7/12 本記事を公開