iT邦幫忙

0

關於 MySQL 資料庫 設定欄位查詢權限問題

您好,MySQL 資料庫版本是 8.0.23 , 有辦法設定某個資料表中的特定幾個欄位不讓套定的帳號查詢 Table 的時候可以看見?

比方說, Person資料表 有三個欄位分別是 ID , Name , Password。
使用者某甲可以 使用 SELECT * FROM Person , 看見全部欄位。
使用者某乙使用 SELECT * FROM Person , 只能看見 ID , Name 這兩個欄位。
我曾經試著在 phpMyAdmin 設定,無法達到這樣的效果。

感謝回覆。

補充一下就是,這個情境不讓使用者透過 View 查詢,也就是說希望能夠限制使用者對資料表本身的查詢。
恕刪,回答錯誤
目前查Google知道MSSQL可以指定使用者只能瀏覽特定欄位~
透過SSMS工具設定帳號權限
MySQL..的話,查Google..沒看到實例介紹@@..
1
海綿寶寶
iT邦大神 1 級 ‧ 2021-11-29 09:15:32

看看這篇合不合用

在下孤陋寡聞

5575859 iT邦新手 5 級 ‧ 2021-12-15 14:47:20 檢舉

5
一級屠豬士
iT邦大師 1 級 ‧ 2021-11-29 09:35:21
-- login as root

create database d1129;

use d1129;

create user u1129 identified by 'u1129xyz';

show grants for u1129;
+-----------------------------------+
| Grants for u1129@%                |
+-----------------------------------+
| GRANT USAGE ON *.* TO `u1129`@`%` |
+-----------------------------------+

flush privileges;

create table t1129 (
  id tinyint unsigned auto_increment primary key
, c1 varchar(10)
, n1 tinyint unsigned
);

insert into t1129(c1, n1) values
('測試', 7);

grant select (id, c1) on d1129.t1129 to u1129;

-- 使用 show 查看
show grants for u1129;

+-------------------------------------------------------------+
| Grants for u1129@%                                          |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1129`@`%`                           |
| GRANT SELECT (`c1`, `id`) ON `d1129`.`t1129` TO `u1129`@`%` |
+-------------------------------------------------------------+

flush privileges;

-- 在系統表中查看 columns 權限
select *
  from mysql.columns_priv;

+------+-------+-------+------------+-------------+---------------------+-------------+
| Host | Db    | User  | Table_name | Column_name | Timestamp           | Column_priv |
+------+-------+-------+------------+-------------+---------------------+-------------+
| %    | d1129 | u1129 | t1129      | c1          | 0000-00-00 00:00:00 | Select      |
| %    | d1129 | u1129 | t1129      | id          | 0000-00-00 00:00:00 | Select      |
+------+-------+-------+------------+-------------+---------------------+-------------+
2 rows in set (0.00 sec)


----
-- user login without database to use (parameter -D)

mysql -u u1129 -p

select id, c1 from d1129.t1129;
+----+--------+
| id | c1     |
+----+--------+
|  1 | 測試   |
+----+--------+

select id, n1 from d1129.t1129;

ERROR 1143 (42000): SELECT command denied to user 'u1129'@'localhost' for column 'n1' in table 't1129'

這樣就做到指定查詢特定欄位的功能了.

https://ithelp.ithome.com.tw/upload/images/20211129/20050647x236hlOu7z.png

借用請教大師,如果
select * from d1129.t1129
是會
1.出現錯誤訊息
2.只 select 出 id, c1

出現 ERROR 1142 (42000)
https://ithelp.ithome.com.tw/upload/images/20211129/20050647RscFUiUBSx.png

/images/emoticon/emoticon41.gif

1
ckp6250
iT邦好手 1 級 ‧ 2021-11-29 10:09:09

使用者某乙使用 SELECT * FROM Person , 只能看見 ID , Name 這兩個欄位。

這樣恐怕做不到哦,執行時會出現 Error
可以控管某些欄位權限不給存取,但只能參考殺豬大的做法,然後,某乙只能下
SELECT ID,Name FROM Person 會成功,若下 select * 會失敗。

世間安得兩全法,又要管控又要*.

ckp6250 iT邦好手 1 級 ‧ 2021-11-29 16:30:38 檢舉

我是覺得,資料庫的設計若更人性化些,應該是要允許 select *
但,對於被管控的欄位,不要出現就好啦。

(我會不會要求太多了?)

我要發表回答

立即登入回答