OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

ユーザ削除時にオブジェクトを削除させない方法

公開日:
基本操作
#コマンド

はじめに

通常、ユーザを削除すると、そのユーザーが所有するオブジェクトも削除されます。
しかし、本稿でご紹介する方法を用いれば、ユーザーを削除してもオブジェクトを残すことが可能です。

概要

ユーザ削除時に、削除対象ユーザが所有するオブジェクトを別のユーザの所有オブジェクトへと自動的に変更することができます。
この方法は、以降で説明するパラメータにユーザを設定することで有効になります。
パラメータに設定するユーザは、オブジェクトの新たな所有者となるユーザを設定します。

パラメータ

下記のパラメータにユーザを設定します。

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

検証バージョンについて

この記事の内容はVertica 9.2で確認しています。

更新履歴

2019/7/12 本記事を公開