2017-08-09 39 views
1

我需要爲我的數據庫創建不同的用戶,每個用戶都可以訪問特定表中的子列。我意識到要做到這一點,我需要分別訪問列,因爲如果我授予對整個表的訪問權限,我不能撤消單個列權限。所以,我現在正在做的是給予的權限如下:在MySQL中單獨授予所有列的權限

GRANT SELECT (`col_1`, `col_2`, ... , `col_100`), SHOW VIEW ON my_db.my_table TO 'my_user'@'%'; 

這是繁瑣和雜亂,因爲我有大量列的,也是不太實際,因爲有可能會更改列列表在將來。有沒有辦法在沒有列出名字的情況下授予每列的權限?然後,我可以撤銷每個用戶的個人用戶。像這樣的:

GRANT SELECT (SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`='my_db' AND `TABLE_NAME`='my_table'), SHOW VIEW ON my_db.my_table TO 'my_user'@'%'; 

(但這給了我一個語法錯誤,所以它顯然不是我所需要的)。有沒有辦法做到這一點?

+0

難道你不能使用像HeidiSQL這樣的工具嗎? –

+0

我需要提供SQL,以便其他用戶可以重複使用,因此不幸的是GUI方法無法正常工作。 – Lisa

+0

HeidiSQL打印它在控制檯中執行的每個命令。您可以將其複製並粘貼到文本編輯器中 - 然後找到並替換用戶名。 –

回答

1

可以使用INFORMATION_SCHEMA,但不你嘗試過的方式。相反,你應該先建立一個查詢字符串。然後準備並執行它。

set @user = 'testuser'; 
set @host = 'localhost'; 
set @schema = 'test'; 
set @table = 'test_table'; 

set @columns = (
    select group_concat('`', column_name, '`') 
    from information_schema.columns 
    where table_schema = @schema 
     and table_name = @table 
); 

set @sql = 'GRANT SELECT({columns}) ON TABLE `{schema}`.`{table}` TO {user}@{host}'; 
set @sql = replace(@sql, '{columns}', @columns); 
set @sql = replace(@sql, '{schema}' , @schema); 
set @sql = replace(@sql, '{table}' , @table); 
set @sql = replace(@sql, '{user}' , quote(@user)); 
set @sql = replace(@sql, '{host}' , quote(@host)); 

prepare stmt from @sql; 
execute stmt; 

根據需要更改四個變量和查詢。

1

如何授予不同的用戶權限:

  • ALL特權─如我們前面看到的,這將允許MySQL用戶 所有訪問指定的數據庫(或者如果沒有選擇數據庫, 整個系統)
  • CREATE-使他們能夠創建新表或數據庫
  • 掇允許它們,將它們刪除表或數據庫
  • 刪除 - 允許他們刪除標籤行萊插入 - 允許他們 插入行到表
  • 選擇 - 允許他們使用選擇命令 通過數據庫讀取
  • 更新 - 允許他們更新表中的行
  • GRANT選項 - 允許他們授予或刪除其他用戶的權限

爲用戶提供一個允許特定的用戶,你可以使用這個框架:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’; 

我希望這會幫助你解決你的問題。永遠不要忘記沖洗!

+0

我已經弄清了這部分,它在我的問題中的第一個代碼片段。我的問題是找到一個更簡單的方式來指定列名稱,而不必將其列出。 – Lisa

+0

@Lisa你可以使用*而不是使用數據庫的名字。這將使用戶訪問所有數據庫。 – Noob

+0

這不適用於撤銷列,它們必須單獨授予才能單獨撤銷(除非出現我做錯的事情)。 – Lisa