はじめに
通常、ユーザを削除すると、そのユーザーが所有するオブジェクトも削除されます。しかし、本稿でご紹介する方法を用いれば、ユーザーを削除してもオブジェクトを残すことが可能です。
概要
ユーザ削除時に、削除対象ユーザが所有するオブジェクトを別のユーザの所有オブジェクトへと自動的に変更することができます。この方法は、以降で説明するパラメータにユーザを設定することで有効になります。
パラメータに設定するユーザは、オブジェクトの新たな所有者となるユーザを設定します。
パラメータ
下記のパラメータにユーザを設定します。GlobalHeirUsername = ‘値’
パラメータに設定する値の内容は以下になります。
値 | 内容 |
---|---|
<AUTO> | デフォルトの値。 削除されたLDAPユーザのオブジェクトをdbadminユーザに所有を変更します。 LDAPユーザでないユーザを削除した場合、ユーザのオブジェクトは削除されます。 |
空文字 | 削除されたユーザのオブジェクトは削除されます。 |
ユーザ名 | 削除されたユーザのオブジェクトは、設定されたユーザに所有を変更します。 設定されたユーザが存在しない場合は、ユーザを作成して所有を変更します。 |
実行例
【存在するユーザをパラメータに設定して、ユーザを削除した場合】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
■ユーザの確認 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) |
【存在しないユーザをパラメータに設定して、ユーザを削除した場合】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
■ユーザの確認 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