偶然在一次實驗中發現mysql許可權分配何時生效的問題,當在同一臺電腦(伺服器)上,我用的只是一台普通pc,建立的乙個普通使用者user1,除測試表test1的select以外無其他許可權
create user user1@localhost;
grant select on test1.* to user1@localhost;
同時用root和user1連線mysql,如不想用圖形化可在cmd命令列執行
mysql -u user1 - p test1
然後在user1使用者下對某張表進行insert的操作(注意user1一直處於連線狀態)
insert into test1 values('aa');
執行結果是user1無相應的許可權,執行不成功
在root下為user1授權
grant insert on test1.* to user1@localhost;
flush privileges;
在user1下再次對錶test1進行insert操作
這時發現,居然還是提示未有相應許可權!!
然後我們user1使用者退出登入後再重新登入上去,這時發現,可以作insert操作了.
因為第一次寫帖還不是很熟悉發圖發**的操作,所以有興趣的朋友可以親自做一下我上面說的這個小測試.
下面引用一下mysql5.1 參考手冊裡的一段話:
5.7.7. 許可權更改何時生效當mysqld啟動時,所有授權表的內容被讀進記憶體並且從此時生效。
當伺服器注意到授權表被改變了時,現存的客戶端連線有如下影響:
表和列許可權在客戶端的下一次請求時生效。
資料庫許可權改變在下乙個use db_name命令生效。
· 全域性許可權的改變和密碼改變在下一次客戶端連線時生效。
如果用grant、revoke或set password對授權表進行修改,伺服器會注意到並立即重新將授權表載入記憶體。
如果你手動地修改授權表(使用insert、update或delete等等),你應該執行mysqladmin flush-privileges或mysqladmin reload告訴伺服器再裝載授權表,否則你的更改將不會生效,除非你重啟伺服器。
如果你直接更改了授權表但忘記過載,重啟伺服器後你的更改方生效。這樣可能讓你迷惑為什麼你的更改沒有什麼變化!
仔細讀了一下才發現,結論很簡單:
當操作物件為 *.*或xx.*(屬於全域性許可權)時,要在下一次客戶端連線時才生效,
當操作物件為xx.xx時,就能做到實時更新了,
僅從這點看來,mysql的安全性並沒有做得太好,
也不知道mysql出於什麼考慮做出了這樣的設計.
MySQL許可權更改何時生效
偶然在一次實驗中發現mysql許可權分配何時生效的問題,當在同一臺電腦 伺服器 上,我用的只是一台普通pc,建立的乙個普通使用者user1,除測試表test1的select以外無其他許可權 create user user1 localhost grant select on test1.to us...
MYSQL當許可權更改生效時
當 mysqld 啟動時,它會將所有授權表內容讀入記憶體。記憶體中的表在此時對訪問控制有效。如果你修改授權表間接使用賬戶管理語句,如 grant,revoke,set password,或 rename user,伺服器注意到這些變化,並立即再次載入授權表到記憶體中。如果你修改授權表直接使用的語句,...
MySQL 許可權生效
用grant revoke或set password對授權表施行的修改會立即被伺服器注意到。如果你手工地修改授權表 使用insert update等等 你應該執行乙個flush privileges語句或執行mysqladmin flush privileges告訴伺服器再裝載授權表,否則你的改變將...