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を参照してください。