本篇文章主要介紹mysql資料庫的授權,以下內容是筆者學習《資料庫系統概念》總結而來,權當筆記。
我們可能會給乙個使用者在資料庫的某些部分授予幾種形式的許可權,包括:
授權讀取資料;
授權插入新資料;
授權更新資料;
授權刪除資料。
每種型別的授權都稱為乙個許可權(privilege)。我們可以在資料庫的某些特定部分(如某個關係或檢視)上授權給使用者所有這些型別的許可權,或者完全不授權,或者這些許可權的乙個組合。
當使用者提交查詢或更新時,sql執行先基於該使用者曾獲得過的許可權檢查此查詢或更新是否是授權過的。如果沒有經過授權,那麼將被拒絕執行。
除了在資料上的授權之外,使用者還可以被授予在資料庫模式上的許可權,例如,可以允許使用者建立、修改或刪除關係。擁有某些形式的許可權的使用者還可以把這樣的許可權轉授給其他使用者,或者撤銷一種此前授出的許可權。最大的授權形式是被授予資料庫管理員的。資料庫管理員可以授權新使用者、重構資料庫等等。
許可權的授予
sql標準包括select、insert、update和delete許可權。所有許可權(all privileges)可以用作所有允許許可權的簡寫形式。乙個建立了新關係的使用者將自動被授予該關係上的所有許可權。
sql資料定義語言包括授予和收回許可權的命令,使用grant語句來授予許可權。此語句的基本形式為:
grant 《許可權列表》
on 《關係名或檢視名》
to 《使用者或角色列表》;
許可權列表使得乙個命令可以授予多個許可權。
在舉例說明grant語句之前,我們先來學習查詢資料庫所有使用者以及增加乙個新使用者。查詢資料庫所有使用者語句如下:
select * from mysql.user;
新增乙個使用者語句形式如下:
create user 使用者名稱
identifiedby '密碼';
例如我們想增加乙個名為zhaoyanzu,密碼為111111的新使用者,sql語句如下:
create user zhaoyanzu
identified by '111111';
然後授予zhaoyanzu關係city的查詢和更新許可權,sql語句如下:
grant select,update
on country.city
to zhaoyanzu;
關係上的select許可權允許使用者讀取關係中的元組,update許可權允許使用者修改關係中的任意元組。update許可權既可以在關係的所有屬性上授予,又可以只在某些屬性上授予。只授予某些屬性的update許可權時,只需要將要授予許可權的屬性列表放在update後面。如果勝率屬性列表(如前述sql),則授予的是關係中所有屬性上的update許可權。例如授予zhaoyanzu關係city的查詢和city_id與city_name屬性的更新許可權,sql語句如下:
grant select,update(city_id,city_name)
on country.city
to zhaoyanzu;
insert許可權允許使用者向關係中插入元組。並且insert許可權也可以指定屬性列表,對關係所做的任何插入必須只針對這些屬性,系統將其餘屬性要麼賦預設值要麼為null。
sql授權機制可以對整個關係或者乙個關係的指定屬性授予許可權,但是不允許對乙個元組的指定元組授權,這種授權意義也不大。
角色
在設計其他系統時,所有的使用者在選單許可權或者操作許可權上或相同或不同,如果單獨為每個使用者授予許可權無疑是很麻煩的。一種更好的方式是將所有使用者按照許可權相同的規則劃分為多個角色,再指明每個角色應該被授予的許可權,有些使用者可能有多個角色。當有新的使用者註冊時,分配給該使用者對應許可權的角色即可。
資料庫中角色(role)的概念也是如此。在資料庫中建立乙個角色集,可以給角色授予許可權,就和給每個使用者授權的方式完全一樣。每個資料庫使用者被授予一組他有權扮演的角色啊(也有可能是空的)。任何可以授予給使用者的許可權都可以授予給角色。給使用者授予角色就跟給使用者授權一樣。
需要注意的是mysql8才開始支援角色管理,建立角色sql語句如下所示:
create role role_name;
然後角色就可以像使用者那樣被授予許可權,如下面的語句形式:
grant 《許可權列表》
on 《關係名或檢視名》
to 《角色列表》;
角色可以授予給使用者,也可以授予給其他角色,如下面的語句形式:
grant role1 to role2;
許可權的轉移
獲得了某些形式授權的使用者可能被允許將此授權傳遞給其他使用者。在預設方式下,被授予許可權的使用者/角色無權把得到的許可權再授予給另外的使用者/角色。如果我們在授權是允許接受者把得到的許可權再傳遞給其他使用者,我們可以在相應的grant命令後面附加with grant option子句或with admin option子句,這兩個子句的區別下面會提到。sql形式如下:
grant 《許可權列表》
on 《關係名或檢視名》
to 《使用者或角色列表》
with grant/admin option;
乙個物件(關係/檢視/角色)的建立者擁有該物件上的所有許可權,包括給其他使用者授權的許可權。
許可權的收回
我們可以用revoke語句來收回許可權。此語句的形式與grant語句幾乎是一樣的。
revoke 《許可權列表》
on 《關係名或檢視名》
from 《使用者或角色列表》;
例如,要收回使用者zhaoyanzu的select和update許可權,sql語句如下:
revoke select,update(city_id,city_name)
on city
from zhaoyanzu;
假如超級管理員u1授權給u2,u2又授權給u3,u3又授權給了u4,當u1要收回u2的授權時,u3和u4的授權也被收回。這種從乙個使用者/角色收回許可權可能導致其他使用者/角色也失去該許可權,這一行為稱作級聯收回。
有時候我們需要級聯刪除,有時候並不需要。上面提到許可權轉移時需要新增with grant option或with admin option子句,這兩個都允許使用者將授予他們的許可權授予其他使用者,但有如下不同點:
with admin option授予的是system privileges許可權;with grant optio授予的是object privileges許可權。
對於使用with admin option授予許可權的使用者,系統收回其許可權時,不會級聯收回。例如使用with admin option授予許可權給u1,u1授予了u2,u2授予了u3,當收回u1的許可權時不會會級聯收回u2,u3的許可權。但可以直接顯示收回u2,u3的許可權。
對於使用with grant option授予許可權的使用者,系統收回其許可權時,會級聯收回。例如使用with grant option授予許可權給u1,u1授予了u2,u2授予了u3,當收回u1的許可權時會級聯收回u2,u3的許可權。但不能直接顯示收回u2,u3的許可權。
資料庫授權操作
use dbname go 1.1 新增登入使用者和密碼 execsp addlogin n testlogin 123456 1.2 使其成為當前資料庫的合法使用者 execsp grantdbaccess n testlogin 2.設定操作授權 2.1 授予對自己資料庫的所有許可權 execs...
mysql資料庫授權
授權命令grant 語句的語法如下 grant privileges columns on what to user identifiedby password with grant option 對使用者授權 mysql grant rights on database.to user host ...
資料庫授權操作
use dbname go 1.1 新增登入使用者和密碼 exec sp addlogin n testlogin 123456 1.2 使其成為當前資料庫的合法使用者 exec sp grantdbaccess n testlogin 2.設定操作授權 2.1 授予對自己資料庫的所有許可權 exe...