MariaDB: SHOW GRANTS FOR USER はテーブルレベル権限を表示しない?
MariaDB: SHOW GRANTS FOR USER はテーブルレベル権限を表示しない?
MariaDB で SHOW GRANTS FOR USER
コマンドを実行すると、ユーザーに付与されたデータベースレベルの権限のみが表示され、テーブルレベルの権限は表示されない。
原因
SHOW GRANTS FOR USER
は、ユーザーに付与された データベースレベルの権限 のみを表示するように設計されています。テーブルレベル権限は、GRANT
ステートメントを使用して個別に付与され、SHOW GRANTS FOR USER
では表示されないためです。
解決策
テーブルレベル権限を確認するには、以下の方法があります。
INFORMATION_SCHEMA.TABLE_PRIVILEGES
テーブルには、テーブルレベル権限に関する情報が格納されています。以下のクエリを実行することで、特定のユーザーのテーブルレベル権限を確認できます。
SELECT *
FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES
WHERE grantee = 'ユーザー名'
AND table_name = 'テーブル名';
mysqldump
コマンドを使用して、データベースの構造とデータをダンプすることができます。ダンプファイルには、テーブルレベル権限に関する情報も含まれます。
mysqldump --no-data --skip-extended-insert --tables テーブル名 > dump.sql
GRANT ステートメントを確認する
テーブルレベル権限は、GRANT
ステートメントを使用して付与されます。SHOW GRANTS FOR USER
の出力を確認することで、テーブルレベル権限が付与されているかどうかを確認できます。
補足
- MariaDB 10.2 以降では、
SHOW GRANTS FOR USER
コマンドにWITH TABLE
オプションを追加することで、テーブルレベル権限も表示できるようになりました。 - テーブルレベル権限は、データベースレベル権限よりも優先されます。
SELECT grantee, table_name, privilege_type
FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES
WHERE grantee = 'test_user'
AND table_name = 'my_table';
出力例
grantee | table_name | privilege_type
------- | -------- | --------
test_user | my_table | SELECT
test_user | my_table | INSERT
test_user | my_table | UPDATE
test_user | my_table | DELETE
mysqldump を使用する
mysqldump --no-data --skip-extended-insert --tables my_table > dump.sql
--
-- Table structure for table `my_table`
--
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Grant privileges
--
GRANT SELECT, INSERT, UPDATE, DELETE ON `my_database`.`my_table` TO 'test_user'@'%';
SHOW GRANTS FOR USER 'test_user'@'%';
GRANT USAGE ON *.* TO 'test_user'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
GRANT SELECT, INSERT, UPDATE, DELETE ON `my_database`.`my_table` TO 'test_user'@'%';
出力例の説明
- 最初の行は、ユーザーに付与されたデータベースレベルの権限を示しています。
- 上記のサンプルコードは、MariaDB 10.2 以降で使用できます。
MariaDBでテーブルレベル権限を確認する他の方法
mysqlコマンドラインツールを使用する
mysql -u root -p
SHOW GRANTS FOR USER 'test_user'@'%';
GRANT USAGE ON *.* TO 'test_user'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
GRANT SELECT, INSERT, UPDATE, DELETE ON `my_database`.`my_table` TO 'test_user'@'%';
MySQL Workbench を使用して、テーブルレベル権限を確認するには、以下の手順を実行します。
- MySQL Workbench を起動し、データベースに接続します。
- ナビゲーションペインで、Security > Users を展開します。
- ユーザーリストから、権限を確認したいユーザーを選択します。
- Schema Privileges タブをクリックします。
- Table 列で、権限を確認したいテーブルを選択します。
- Privileges 列で、付与されている権限を確認できます。
- phpMyAdmin にログインし、データベースを選択します。
- Users タブをクリックします。
- Edit privileges セクションで、Database ドロップダウンリストから Specific database を選択します。
- Database フィールドに、権限を確認したいデータベースの名前を入力します。
- Go ボタンをクリックします。
mariadb