Berikan izin pada tampilan, tolak pilih pada tabel

9

Saya memiliki pengguna MySQL dan saya ingin melihatnya HANYA pandangan yang saya inginkan dan bukan tabel lain dalam database. Saya telah memberikan izin pengguna ini hanya pada tampilan tertentu sebagai berikut:

GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'

Jika saya membuat show grants;pernyataan, saya hanya bisa melihat izin ini seperti yang diharapkan. Namun saya ingin pengguna ini untuk query HANYA pandangan dan bukan tabel yang terkait dengan pandangan ini, tetapi saya tidak dapat menemukan cara untuk melakukan ini. Tampaknya jika saya ingin pengguna melakukan pilih pada tampilan, pilih juga harus diberikan untuk tabel, atau apakah saya salah?

Jika saya menolak selectpernyataan di sisa tabel, dan di baris perintah saya mencoba melakukan pilih saya mendapat yang berikut:

SELECT * FROM myDatabase.fordibenForYouTable;
ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable'

Itu memang yang saya inginkan, tetapi saya juga ditolak jika saya memilih tampilan data.

Apakah ada cara agar saya bisa menyediakan bagi pengguna hanya tampilan dan bukan tabel?

Metafaniel
sumber

Jawaban:

6

Anda harus memperlakukan tampilan sebagai tabel. Information_schema sudah melakukannya

Jika Anda berlari

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;

Anda mendapatkan semua tampilan.

Berikan saja SELECT pada tampilan kepada pengguna sebagai berikut

GRANT SELECT ON `myDatabase`.`fordibenForYouTable` TO 'thisUser'@'localhost' ;

Setelah Anda melakukan ini, Anda harus memiliki akses SELECT ke tabel.

Untuk memastikan, jalankan SHOW GRANTS FOR 'thisUser'@'localhost';

Anda juga harus dapat melihat akses tingkat tabel apa yang diberikan 'thisUser'@'localhost'

SELECT * FROM mysql.tables_priv
WHERE user='thisUser' and host='localhost'\G

Anda juga dapat melihat pengguna memiliki akses tingkat tabel myDatabase.fordibenForYouTable

SELECT * FROM mysql.tables_priv
WHERE db='myDatabase' and table_name='fordibenForYouTable'\G

COBALAH !!!

RolandoMySQLDBA
sumber
Hei, kamu berhasil! Terima kasih! Saya tidak dapat menemukan solusi untuk saya sendiri! Terima kasih banyak!
Metafaniel
5

Saya tahu ini sudah tua sekarang tetapi di sini adalah apa yang memecahkan masalah ini untuk saya ...

Jawabannya adalah dengan sintaks "SQL SECURITY".

definisi tampilan asli saya telah mengatur SQL SECURITY menjadi "INVOKER". Ini berarti pengguna terpaksa memiliki izin pilih pada tampilan dan tabel.

Ketika saya mengubah SQL SECURITY menjadi "DEFINER", saya dapat memberikan izin pilih pengguna hanya pada tampilan.

John
sumber