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;ユーザー
testにすべてのデータベースのすべてのテーブルに対するINSERTおよびSELECT権限を付与します。obclient> GRANT SELECT, INSERT ON *.* TO test;
データベースレベルの権限の付与
データベースレベルの権限とは、特定のデータベース内のすべてのオブジェクトに対する操作権限を指します。通常は
GRANT ... ON db_name.*を使用してデータベースレベルの権限を付与します。ユーザー
testにデータベースdb1のすべてのオブジェクトに対する操作権限を付与します。obclient> GRANT ALL ON db1.* TO test;ユーザー
testにデータベースdb1のすべてのテーブルに対するINSERTおよびSELECT権限を付与します。obclient> GRANT SELECT, INSERT ON db1.* TO test;
テーブルレベルの権限の付与
オブジェクト権限とは、特定のデータベース内の指定されたテーブルに対する操作権限を指します。通常は
GRANT ... ON db_name.tb1_nameを使用してオブジェクト権限を付与します。ユーザー
testにデータベースdb1内のテーブルtb1_nameに対するINSERTおよびSELECT権限を付与します。obclient> GRANT SELECT, INSERT ON db1.tb1_name TO test;ユーザー
testにデータベースdb1内のテーブルtb1_nameに対する操作権限を付与します。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を参照してください。