GRANT ステートメントを使用して、ユーザーに直接権限を付与できます。
前提条件
現在のユーザーが付与される権限を既に持っている必要があります(例えば、test1 がテーブル t1 の SELECT 権限を test2 に付与する場合、test1 はテーブル t1 の SELECT 権限を持っている必要があります)。また、GRANT OPTION 権限も持っている必要があります。
現在持っている権限を確認するには、ユーザー権限の確認を参照してください。
注意事項
権限付与を行う前に、以下の点に注意してください:
特定のユーザーに権限を付与する際、そのユーザーが存在しない場合は、直接ユーザーを作成できます。ただし、
sql_mode='no_auto_create_user'であり、かつステートメントにパスワードを指定するIDENTIFIED BY句がない場合は、直接ユーザーを作成できません。複数の権限を同時にユーザーに付与する場合、権限タイプは半角カンマ(,)で区切ります。
複数のユーザーに同時に権限を付与する場合、ユーザー名は半角カンマ(,)で区切ります。
ユーザーに権限が付与された後、その権限が有効になるには、ユーザーがOceanBaseデータベースに再接続する必要があります。
現在
CHANGE EFFECTIVE TENANT権限の制御がないため、sysテナントのユーザーはすべて権限付与を行うことができます。
権限付与の構文
権限付与の構文は次のとおりです:
GRANT priv_type
ON priv_level
TO user_specification [, user_specification]...
[WITH GRANT OPTION];
priv_level:
*
| *.*
| database_name.*
| database_name.table_name
| table_name
| database_name.routine_name
user_specification:
user_name [IDENTIFIED BY [PASSWORD] 'password']
ステートメントの使い方:
priv_type:付与する権限タイプを指定します。複数の権限を同時にユーザーに付与する場合、権限タイプの間に半角カンマ(,)を入れます。列レベルの権限を付与する必要がある場合は、対応する権限タイプの後に列名を指定する必要があります(形式は
priv(col_list))。複数の列を指定することも可能で、列名の間には半角カンマを入れます。例えば、c1列のSELECT権限を付与する場合は、SELECT(c1)と表記します。テーブルの列を選択して権限を付与する場合:
一部の列に対して
UPDATEステートメントを実行する必要がある場合、ユーザーにこれらの列のUPDATE権限と、アクセスする他の列のSELECT権限を付与する必要があります。例えば、以下のステートメントの場合:
obclient> UPDATE tb1 SET c1=c3, c2=1+3 WHERE c4=1;更新が必要な列は
c1とc2であるため、ユーザーにc1およびc2列に対するUPDATE権限を付与する必要があります。同時にc3およびc4列にもアクセスする必要があるため、ユーザーにc3およびc4列に対するSELECT権限も付与する必要があります。特定の列に対して
INSERTステートメントまたはREPLACEステートメントを実行する必要がある場合は、データを挿入する列に対するINSERT権限と、アクセスする他の列に対するSELECT権限をユーザーに付与する必要があります。その他のステートメントの場合、アクセスする列に対する
SELECT権限をユーザーに付与するだけで済みます。
MySQLモードでサポートされているすべての権限タイプについては、MySQLモードの権限分類を参照してください。
priv_level:付与する権限のレベルを指定します。MySQLモードでは、権限は主に以下のレベルに分かれています:グローバル:すべてのデータベースに適用されます。
GRANT ... ON *.*を使用してグローバル権限を付与します。データベースレベル:指定されたデータベース内のすべてのオブジェクトに適用されます。
GRANT ... ON db_name.*を使用してデータベースレベルの権限を付与します。テーブルレベル:指定されたテーブル内のすべての列に適用されます。
GRANT ... ON database_name.table_nameを使用してテーブルレベルの権限を付与します。列権限を付与する際も、
GRANT ... ON database_name.table_nameを使用して指定するテーブルを示します。
user_specification:権限を付与するユーザーを指定します。ユーザーが存在しない場合は、そのままユーザーを作成します。複数のユーザーに同時に権限を付与する場合、ユーザー名を半角カンマ(,)で区切ります。
user_name IDENTIFIED BY 'password'とuser_name IDENTIFIED BY PASSWORD 'password':user_name IDENTIFIED BY 'password'句のパスワードは平文です。user_name IDENTIFIED BY PASSWORD 'password'句のパスワードは暗号文です。WITH GRANT OPTION:権限の再付与または取り消しを許可するかどうかを指定します。
操作例
グローバル権限の付与
この権限はすべてのデータベースに適用されます。通常は
GRANT ... ON *.*を使用してグローバル権限を付与します。すべてのデータベースのすべてのオブジェクトに対する権限をユーザー
testに付与します。obclient> GRANT ALL ON *.* TO test;すべてのデータベースのすべてのテーブルに対する
INSERT、SELECT権限をユーザーtestに付与します。obclient> GRANT SELECT, INSERT ON *.* TO test;
データベースレベル権限の付与
データベースレベル権限とは、特定のデータベース内のすべてのオブジェクトに対する操作権限を指します。通常は
GRANT ... ON db_name.*を使用してデータベースレベル権限を付与します。データベース
db1のすべてのオブジェクトに対する操作権限をユーザーtestに付与します。obclient> GRANT ALL ON db1.* TO test;データベース
db1のすべてのテーブルに対するINSERT、SELECT権限をユーザーtestに付与します。obclient> GRANT SELECT, INSERT ON db1.* TO test;
テーブルレベル権限の付与
オブジェクト権限とは、特定のデータベース内の特定のテーブルに対する操作権限を指します。通常、
GRANT ... ON db_name.tb1_nameを使用してオブジェクト権限を付与します。データベース
db1のテーブルtb1_nameに対するINSERT、SELECT権限をユーザーtestに付与します。obclient> GRANT SELECT, INSERT ON db1.tb1_name TO test;データベース
db1のテーブルtb1_nameに対する操作権限をユーザーtestに付与します。obclient> GRANT ALL ON db1.tb1_name TO test;
テーブル内の列に対する権限の付与
列権限とは、特定のテーブルの特定の列に対する操作権限を指します。
以下の例では、データベース
db1のテーブルtb1_nameのc1列に対するSELECT権限およびc1列とc2列に対するINSERT権限をユーザーtestに付与します。obclient> GRANT SELECT(c1), INSERT (c1, c2) ON db1.tb1_name TO test;
GRANT ステートメントの詳細については、GRANTを参照してください。