Sql Server來龍去脈系列 必須知道的許可權控制基礎篇

來源:互聯網
上載者:User

標籤:庫檔案   off   中繼資料   read_only   [1]   線上   基礎   文法   資料庫管理   

題外話:最近看到各種吐槽.NET怎麼落寞、.NET怎麼不行了、.NET工資低的文章。我也吐槽一句:一個程式猿的自身價值不是由他選擇了哪一門技術來決定,而是由他自身能創造出什麼價值來決定。

    在進入本篇內容之前,這裡有幾個問題:

    1.一般程式猿都知道怎樣建立、修改、登入帳號,但知不知道登陸帳號儲存在哪個表或者視圖?

    2.資料庫中其實存在登入帳號和使用者兩個概念,你能解釋清楚這兩個概念嗎?

    3.對於一個登入帳號,我們可以為他設定哪些許可權?

    4.你清不清楚資料庫資訊儲存在哪些表或試圖?

    5.我們可以給登入帳號設定許可權,但清不清楚具體有哪兩種許可權?

   

    如果你回答不上,那接下來的內容有必要知道。如果都能很清楚的回答出來,接下來的內容你可以直接忽略。

    前一段時間寫了Sql Server來龍去脈系列的前四篇,包括資料庫的架構和配置、查詢過程跟蹤、資料庫庫和檔案。說實話, 當時寫的時候自己都是一知半解,有些內容瞭解得不是很清楚。近來我一直沒有更新系列的後續內容,而是把時間用來寫一個小的資料庫許可權管理系統,為得就是把前面寫的系列隨筆涉及到的知識鞏固下。系統的主介面如:

    介面上的導覽功能表也就是這篇隨筆的主要內容,包括登陸帳號、資料庫、許可權控制。許可權控制包括了服務許可權和資料庫許可權。需要說明的是:介面上的說的使用者實際是登陸帳號,而資料庫使用者和帳號是有區別的。

    像登入帳號、資料庫以及許可權等系統中繼資料一般是不允許直接操作的,那麼我們怎樣讀取以及怎樣修改更新這些中繼資料?Sql Server為開發人員提供了系統檢視表、預存程序、DDL(資料定義語言 (Data Definition Language))用來讀取以及更改系統中繼資料。DDL全稱是Data Definition Laguage,它的文法包括我們經常用到的CREATE、ALTER、DROP等。開發人員在MSDN上也能找到對應的線上說明。下面分別給出協助連結:

    1.系統檢視表:https://msdn.microsoft.com/zh-cn/library/ms177862(v=sql.120).aspx,查看中繼資料一般都是通過目錄檢視尋找。

    2.預存程序:https://msdn.microsoft.com/zh-cn/library/ms187961(v=sql.120).aspx

    3.DDL:https://msdn.microsoft.com/zh-cn/library/ff848799(v=sql.120).aspx

    接下來我們分別介紹前面說的登入帳號管理、資料庫管理以及許可權管理。

登入帳號管理
帳號查詢

    管理維護Sql Server資料庫,一般都是使用Sql Server Management Studio。當我們成功連結資料庫執行個體後,可通過Security/Logins管理登入帳號。如:

    這裡有個疑問:這些帳號資訊是從哪裡查出來的?之前我們介紹了系統中繼資料可通過系統檢視表查詢。登入帳號的目錄檢視是sys.syslogins,我們可通過下面的查詢語句查詢登入帳號資訊:

select * from sys.syslogins, 欄位說明:https://msdn.microsoft.com/zh-cn/library/ms178593(v=sql.120).aspx

    執行結果如下:

    返回的結果包括了name、dbname、password、language,這幾個欄位是經常涉及到的,每行資料不止上面這些欄位,還包括服務許可權欄位,如下:

    至於這些欄位有什麼用,後面介紹許可權時再說明。在我自己寫的資料管理系統中就是通過從sys.syslogins查詢資料。系統介面如下:

建立帳號

    知道資料怎麼查詢後,我們繼續看怎樣建立登入帳號,就是建立登入帳號的介面:

    介面包括了登入名稱、密碼、預設資料庫、預設語言,登陸名和密碼操作者自己輸入,但預設資料庫和預設語言只能選擇資料庫存在的。所有我們必須得知道怎樣查詢資料庫表和語言表,這裡就提出了 另外兩個目錄檢視sys.databases、sys.syslanguages。通過名字也能知道這兩個表分別儲存的是資料庫和語言的中繼資料。執行下面語句查詢資料庫中存在哪些資料庫:

select name, database_id, owner_sid, create_date from sys.databases,欄位說明:https://msdn.microsoft.com/zh-cn/library/ms178534(v=sql.120).aspx

    結果如下:

    結果中包含owner_sid欄位,這個欄位就是儲存的登入帳號的系統ID,一般是哪個登入帳號建立的資料庫,這個資料庫就屬於這個建立它的登陸帳號。執行下面語句:

select db.name, db.database_id, lg.name, db.create_date from sys.databases db inner join sys.syslogins lg on db.owner_sid = lg.sid

    結果如下:

    通過結果一目瞭然的看出每個資料庫的所屬者。記得在初始化系統資料庫指令碼時,一般都會判斷資料庫是否存在。現在我們知道可以通過sys.databases視圖查看資料庫資訊,那麼我們也通過以下語句判斷一個資料庫是否存在:

if exists (select * from sys.databases where name = ‘資料庫名‘)     drop database [資料庫名]

    sys.syslanguages的資料比較簡單,這裡就不再說明。可通過https://msdn.microsoft.com/zh-cn/library/ms190303(v=sql.120).aspx查看欄位解釋。現在再回到之前的建立介面,資料庫和語言我們都能提供出來了,登入名稱和密碼也輸入了。但怎麼把資料插入到資料庫?這裡就提到前面說的資料定義語言 (Data Definition Language)DDL,用CREATE LOGIN關鍵字建立登入帳號。先看下在系統中我拼湊的SQL語句:

string sql = string.Format("CREATE LOGIN [{3}] WITH PASSWORD = N‘{0}‘, DEFAULT_DATABASE =[{1}], DEFAULT_LANGUAGE =[{2}]" , login.Password, login.DbName, login.Laguage, login.Name);

   語句很簡單,PASSWORD設定密碼,DEFAULT_DATABASE設定預設資料庫,DEFAULT_LANGUAGE設定預設語言。當然建立登入帳號的參數肯定不止這些,我們可通過https://msdn.microsoft.com/zh-cn/library/ms189751(v=sql.120).aspx查看建立登入帳號所有的參數。

修改帳號

   現在已經知道怎樣建立登入帳號了,但有些時候我們需要修改登入帳號的某些資訊,例如密碼、預設資料庫。修改登入帳號使用DDL語言的ALTER LOGIN關鍵字。修改語句和建立語句極其相似,只是把CREAT關鍵字改成了ALTER。看看下面的系統修改登入帳號代碼:

string sql = string.Format("ALTER LOGIN {0} WITH PASSWORD = N‘{1}‘, DEFAULT_DATABASE =[{2}],DEFAULT_LANGUAGE =[{3}]", name, login.Password, login.DbName, login.Laguage)//參考:https://msdn.microsoft.com/zh-cn/library/ms189828(v=sql.120).aspx
刪除帳號

    最後還剩下刪除操作,我們知道刪除表的語句一般是 DROP TABLE [表名],而刪除登陸帳號也相似,執行:

DROP LOGIN [登入名稱], https://msdn.microsoft.com/zh-cn/library/ms188012(v=sql.120).aspx

    知道了上面這些內容,我們就可以很容易理解怎樣增刪改查登入帳號了。但一個登入帳號不是單獨的存在資料庫中,它還關聯了服務許可權、資料庫許可權等。

資料庫管理
查詢資料庫

    資料庫同樣也涉及到增刪改查,首先看看怎樣查詢資料庫。在上一節我們知道資料庫可以從sys.databases目錄檢視中查看,先看看許可權系統的資料庫查詢介面,如所示:

    通過列表我們能看到資料庫名稱、資料庫擁有者、建立時間以及檔案路徑。然後我們執行語句:

select * from sys.databases

    執行結果如下:

    分析查詢結果,我們單從sys.databases視圖中是看不到資料庫擁有者的名字以及資料庫檔案路徑。但上一節我們講了登入帳號,我們知道它也有一個sid,所有可以通過sys.databases中的owner_sid和sys.logins關聯。但資料庫檔案從哪裡查詢?這裡又提出了另外一個目錄檢視sys.master_files,它包含了資料庫檔案的資訊。先執行下面語句:

select * from sys.master_files,https://msdn.microsoft.com/zh-cn/library/ms186782(v=sql.120).aspx

    執行結果如下:

    從查詢結果可以看出,每個資料庫基本上包含兩行資料。其中,type欄位分別為ROWS、LOG,表示資料和記錄檔。結果欄位中還有一個file_id,它關聯了另外一張資料庫檔案視圖sys.database_files。sys.database_files儲存了資料庫檔案的詳細資料,包括檔案類型、檔案大小、檔案最大值、檔案增長值。執行下面語句:

select * from sys.database_files,視圖說明:https://msdn.microsoft.com/zh-cn/library/ms174397(v=sql.120).aspx

    查詢結果如下:

    這裡有個問題:為什麼查詢結果只返回了兩條資料?這是因為我當前選擇的資料是master,sys.database_files只返回當前資料庫的檔案資訊。現在資料庫資訊都知道了.另外,還有一個相容資料庫檢視sys.sysdatabases(視圖說明:https://msdn.microsoft.com/zh-cn/library/ms179900(v=sql.120).aspx)。它和sys.databases差不多,但能查詢出檔案的實體路徑。sys.sysdatabases是sql server 2000中的系統檢視表,現在已經不建議使用了。以上幾個資料庫的關聯關係如下:

    視圖表已經有了,可直接通過多表關聯查詢出許可權管理展示的結果。關聯的查詢語句如下:

select db.name as Name, db.database_id as DbId, db.create_date as CrTime, db.owner_sid as OwnerId, lg.name as OwnerName, mf.physical_name  as FileName     from sys.databases db    left join sys.syslogins lg on db.owner_sid = lg.sid    left join sys.master_files mf on db.database_id = mf.database_id and mf.type = 0

    執行結果如下:

建立資料庫

    作為一個開發人員,肯定會經常涉及到建立資料庫。那麼怎樣建立資料庫以及建立資料庫需要哪些參數?通過建立登入帳號(CREATE LOGINS )語句,我們 可以推理建立資料庫也是使用資料定義語句CREATE DATABASE來建立資料。我們先看看許可權管理資料庫的查詢介面:

    包含了資料庫名稱、資料庫擁有者、初始化大小、增長方式、以及檔案的最大值。當然,還必須有資料庫檔案資訊,我直接在後台把檔案路徑寫死了,和系統資料庫同目錄。資料庫名稱由我們自己定義,資料庫擁有者可通過sys.syslogins查詢選擇,初始值大小由我們自己設定,增長方式包括按照固定值大小或者按照百分比增長、檔案最大值包括無限制或者設定最大值、資料庫檔案路徑配置為磁碟路徑。

    參數已經瞭解,接下來分析具體的建立語句,我們可以從msdn上查看到完整的資料庫建立語句:

Create a databaseCREATE DATABASE database_name [ CONTAINMENT = { NONE | PARTIAL } ][ ON       [ PRIMARY ] <filespec> [ ,...n ]       [ , <filegroup> [ ,...n ] ]       [ LOG ON <filespec> [ ,...n ] ] ] [ COLLATE collation_name ][ WITH  <option> [,...n ] ][;]<option> ::={      FILESTREAM ( <filestream_option> [,...n ] )    | DEFAULT_FULLTEXT_LANGUAGE = { lcid | language_name | language_alias }    | DEFAULT_LANGUAGE = { lcid | language_name | language_alias }    | NESTED_TRIGGERS = { OFF | ON }    | TRANSFORM_NOISE_WORDS = { OFF | ON}    | TWO_DIGIT_YEAR_CUTOFF = <two_digit_year_cutoff>     | DB_CHAINING { OFF | ON }    | TRUSTWORTHY { OFF | ON }}<filestream_option> ::={      NON_TRANSACTED_ACCESS = { OFF | READ_ONLY | FULL }    | DIRECTORY_NAME = ‘directory_name‘ }<filespec> ::= {(    NAME = logical_file_name ,    FILENAME = { ‘os_file_name‘ | ‘filestream_path‘ }     [ , SIZE = size [ KB | MB | GB | TB ] ]     [ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ]     [ , FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ])}<filegroup> ::= {FILEGROUP filegroup name [ [ CONTAINS FILESTREAM ] [ DEFAULT ] | CONTAINS MEMORY_OPTIMIZED_DATA ]    <filespec> [ ,...n ]}<service_broker_option> ::={    ENABLE_BROKER  | NEW_BROKER  | ERROR_BROKER_CONVERSATIONS}

    具體參數請參考:https://msdn.microsoft.com/zh-cn/library/ms176061(v=sql.120).aspx

    現在我們通過許可權管理系統建立資料庫,在建立介面輸入資料庫參數,如所示:

    點擊“建立”按鈕後, 伺服器自動產生資料庫建立SQL語句 ,如下:

USE master;CREATE DATABASE HeaviDb ON(Name = HeaviDb,FILENAME = ‘D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\HeaviDb.mdf‘,SIZE = 10,FILEGROWTH = 2MB,MAXSIZE = 500)

    在建立資料庫時,我們一般要把當前資料庫切換到master資料庫。上面的語句只指定了FILENAME,而沒有指定log的FILENAME,這種情況SQL SERVER會自動在FILENAME同目錄下為我們自動建立HeaviDb_log.ldf檔案。SIZE設定為10,這裡沒有單位,預設單位為MB,也可以顯示指定KB、MB、GB、TB尾碼,例如SIZE = 10MB或者SIZE = 10GB。FILEGROWTH設定為2MB,即資料庫按照2MB自增長,另外我們也可以按照百分比增長,例如FILEGROWTH = 10%。MAXSIZE設定為500,預設單位也是MB。如果我們不限制資料庫檔案大小,可直接用UNLIMITED代替MAXSIZE = 500。執行以上SQL語句,我們就能在資料庫中查看到該資料庫了。

修改資料庫

    這一節討論怎樣修改資料庫,但這裡會涉及到比較核心的知識點。在許可權管理系統中,選中資料庫列表某一列,點擊“修改”按鈕,彈出修改資料庫介面。但這裡有一個問題,在資料庫列表中只包含了 資料庫名稱、檔案以及資料庫擁有者資訊。而我們修改介面展示了資料庫初始大小以及自增長值。這些資訊在列表中是沒有的。但通過資料庫查詢我們知道這些資訊儲存在sys.master_files中。執行查詢語句:

select mf.database_id as DbId, mf.name as Name, mf.size as InitSize, mf.max_size as MaxSize, mf.growth as Growth, mf.is_percent_growth as IsPercentGrowth from sys.master_files mf where mf.type = 0

    查詢結果如下:

    查詢的資料結果我們不能直接使用,資料庫大小InitSize、資料庫最大值MaxSize、自增長值Growth這些資料不能直接展示在介面,那這些資料到底是什麼意思呢?先看看msdn對這幾個欄位的描述:

size int 當前檔案大小(以 8 KB 為單位的頁數)。 對於資料庫快照集來說,size 表示該快照可以一直用於檔案的最大空間。
max_size int

最大檔案大小(以 8 KB 為單位的頁數):

0 = 不允許增長。

-1 = 檔案將一直增長到磁碟充滿為止。

268435456 = 記錄檔將增長到最大大小 2 TB。

growth int

0 = 檔案大小固定,不會增長。

>0 = 檔案將自動成長。

如果 is_percent_growth = 0,則以若干個 8 KB 頁為增量遞增,舍入為 64 KB

如果 is_percent_growth = 1,增量將用整數百分比表示。

is_percent_growth bit

1 = 檔案的增長以百分比表示。

0 = 以頁數為單位表示絕對增長大小。

    分析幾個欄位:

    1.size:沒有直接隱藏檔大小,而是隱藏檔的總頁數,每一頁大小為8KB。以MB為size單位,size的實際值則應該為:(size * 8 /1024)MB;

    2. max_size:有三種值,一是等於-1,二是等於0,另一種是大於0 。等於-1表示UNLIMITED(沒有限制)。等於0表示不允許增長。大於0時和size相似,以MB為max_size單位,max_size實際值則應該為:(max_size * 8 /1024)MB;

    3.is_percent_growth:值等於0或者1,等於1表示按百分比自增長。等於0表示按固定值增長;

    4.growth:等於0表示固定大小,不會自增增長。大於0時依賴於is_percent_growth的值。如果is_percent_growth=0,growth按固定數字自增長。以MB為單位,growth實際值為(growth * 8 /1024)MB。如果is_percent_growth=1,則growth的實際值為growth%;

    以上欄位瞭解清楚後,我們的資料庫檔案參數就能顯示出來了。例如,修改剛才建立的HeaviDb資料庫,彈出修改介面如下:

   修改初始值為20,增長方式為pecent並且值為10,檔案最大值沒有限制。這裡需要說明幾點:

    1.修改的初始值不能小於當前資料庫檔案的實際大小;

    2.如果檔案最大值限制為固定值,那麼這個固定值不能小於當前資料庫大小以及修改後的資料庫大小(初始值);

    修改參數後介面如下:

    點擊“儲存”按鈕,後台產生的SQL語句如下:

USE master;ALTER DATABASE HeaviDb MODIFY FILE (Name = HeaviDb,SIZE = 20,FILEGROWTH = 20,MAXSIZE = UNLIMITED)

    修改資料庫使用DDL的ALTER DATABASE語句,修改檔案使用MODIFY FILE語句。完整的資料庫修改SQL請查看:

https://msdn.microsoft.com/zh-cn/library/ms174269(v=sql.120).aspx。

刪除資料庫

    資料庫的刪除語句比較簡單,SQL與語句如下:

USE master;DROP DATABASE HeaviDb

    刪除資料庫必須知道:系統資料庫是不能刪除的;不能刪除正在使用的資料庫。

總結

    本篇隨筆主要介紹了登入帳號的查詢、建立、修改、刪除,以及資料庫的查詢、建立、修改、刪除所涉及的系統檢視表以及DDL語句。通過這篇內容我們能夠比較清楚的瞭解登入帳號以及資料庫在SQL SERVER中的儲存中繼資料結構。本篇的內容都是一些基礎知識,但同時也是比較重要的基礎知識。下一篇將會詳細分析資料庫中登入帳號和資料庫的使用權限設定。

Sql Server來龍去脈系列 必須知道的許可權控制基礎篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.