MSSQL → 02:数据库结构
一、數據庫的組成
在SQL Server 2008中,用戶如何訪問及使用數據庫,就需要正確了解數據庫中所有對象及其設置。數據庫就像一個容器,它里面除了存放著數據的表之外,還有視圖、存儲過程、觸發器、約束等數據庫對象。數據庫管理的核心任務包括創建、操作和維護數據庫。
二、數據庫文件及其文件組
數據庫的存儲結構分為邏輯存儲結構和物理存儲結構。
- 邏輯存儲結構:說明數據庫是由哪些性質的信息所組成。SQL Server的數據庫不僅僅只是數據的存儲,所有與數據處理操作相關的信息都存儲在數據庫中。
- 物理存儲結構:數據庫在磁盤上是以文件為單位存儲的,由數據庫文件和事務日志文件組成,一個數據庫至少應該包含一個數據庫文件和一個事務日志文件。
SQL Server數據庫系統中的數據庫文件是由數據文件和日志文件組成的,數據文件以盤區為單位存儲在存儲器中。
2.1、數據文件
數據庫文件是指數據庫中用來存放數據庫數據和數據庫對象的文件,一個數據庫可以有一個或多個數據庫文件,一個數據庫文件只能屬于一個數據庫。當有多個數據庫文件時,有一個文件被定為主數據文件,用來存儲數據庫的啟動信息和部分或全部數據,一個數據庫只能有一個主數據庫文件。數據文件則劃分為不同的頁面和區域,頁是SQL Server存儲數據的基本單位。
- 主數據文件:是數據庫的起點,指向數據庫文件的其他部分,每個數據庫都有一個主要數據文件,擴展名為.mdf。
- 次數據文件:包含除主數據庫文件之外的所有數據文件,一個數據庫可以沒有次數據文件,也可以有多個次數據文件,擴展名為.ndf。
- 事務日志文件:包含恢復數據庫所有事務日志的信息。每個數據庫必須至少有一個事務日志文件,當然也可以有多個,事務日志文件的推薦文件擴展名是.ldf
- 文件流( Filestream):可以使得基于 SQLServer的應用程序能在文件系統中存儲非結構化的數據,如文檔、圖片、音頻等,文件流主要將SQLServer數據庫引擎和新技術文件系統(NTFS)集成在一起,它主要以varbinary (max)數據類型存儲數據。
2.2、日志文件
SQL Server的日志是由一系列日志記錄組成,日志文件中記錄了存儲數據庫的更新情況等事務日志信息,用戶對數據庫進行的插入、刪除和更新等操作都會記錄在日志文件中。當數據庫損壞時,可以根據日志文件來分析出錯的原因,或者數據丟失時,還可以使用事務日志恢復數據庫。每一個數據庫至少必須擁有一個事務日志文件,而且允許擁有多個日志文件。
SQL Server2012不強制使用.mdf、.ndf或者.ldf作為文件的擴展名,但建議使用這些擴展名幫助標準文件的用途。數據庫中的所有文件的位置都記錄在master數據庫和該數據庫在主數據文件中。
三、數據庫的分類
3.1、系統數據庫:由系統服務提供
SQLServer系統數據庫分別是:master、model、tempdb、msdb數據庫。
3.1.1、master數據庫
master是SQL Server中最重要的數據庫,是整個數據庫服務器的核心。用戶不能直接修改master數據庫,如果master數據庫損壞了,那么整個SQL Server服務器將不能工作。
master數據庫中包含了以下的一些內容:
- 所有用戶的登錄信息
- 用戶所在的組
- 所有系統的配置選項
- 服務器中本地數據庫的名稱和信息
- SQL Server的初始化方式等
master數據庫保存系統表用于系統的總體控制。如在新建一個數據庫時,在master數據庫的sysdatabases表中插入對應的記錄。
作為一個數據庫管理員,應該定期備份master數據庫。
3.1.2、model數據庫
model數據庫是SQL Server中創建數據庫的模板,如果用戶
- 希望創建的數據庫有相同的初始化文件大小,則可以在model數據庫中保存文件大小的信息;
- 希望所有的數據庫中都有相同的一個或多個表,可以將該數據表保存在model數據庫中。
新創建的數據庫以model數據庫中的數據作為模板,因此在修改model數據庫之前要考慮到,任何對model數據庫中數據的修改都要影響到所有使用該模板創建的數據庫。
由于model數據庫作為其他任意數據庫的模板,系統中必須保留,不能刪除。
在更改model數據庫時需要注意:任意新建的數據庫至少要比model數據庫大。如果將model數據庫大小更改為100MB,則不能創建小于100MB的數據庫。
3.1.3、tempdb數據庫
msdb提供了運行SQL Server Agent工作的信息。SQL Server Agent是SQL Server中的一個Windows服務,該服務用來運行制定的計劃任務。如在計劃對一個數據庫每夜進行備份時,則在msdb數據庫中有一個相應的記錄項。
3.1.4、msdb數據庫
tempdb是SQL Server中的一個臨時數據庫,用于存放臨時對象或中間結果,只要創建臨時表,則臨時表會創建在tempdb數據庫中。SQL Server關閉后,該數據庫中的內容被清空,每次重新啟動服務器之后,tempdb數據庫將被完全重建。
Tempdb數據庫保存系統運行過程中產生的臨時表和存儲過程。當然,它還滿足其他的臨時存儲要求,比如保存SQL Server生成的存儲表等。Tempdb數據庫是一個全局咨詢,任何連接到系統的用戶都可以在該數據中產生臨時表和存儲過程。Tempdb數據庫在每次SQL Server啟動的時候,都會清空該數據庫中的內容,所以每次啟動SQL Server后,該表都是干凈的。臨時表和存儲過程在連接斷開后會自動除去,而且當系統關閉后不會有任何活動連接,因此,Tempdb數據庫中沒有任何內容會從SQL Server的一個會話保存到另一個會話中。
默認情況下,在SQL Server在運行時Tempdb數據庫會根據需要自動增長。不過,與其它數據庫不同,每次啟動數據庫引擎時,它會重置為其初始大小。如果為Tempdb數據庫定義的大小較小,則每次重新啟動SQL Server時,將Tempdb數據庫的大小自動增加到支持工作負荷所需的大小這一工作可能會成為系統處理負荷的一部分。為避免這種開銷,可已使用ALTER DATABASE 增加Tempdb數據庫的大小。
3.2、用戶數據庫:用戶或程序員創建的數據庫
四、創建數據庫用戶及授權
-
使用SSMS圖形界面創建數據庫
? ?、?、打開安全性--登錄名,右鍵 新建用戶
?、凇⒋藭r會出現Windows和SQL server身份驗證
?、邸⒋藭r先選擇Windows身份登錄,點擊 搜索,則彈出 選擇用戶和組的彈出框,在其中輸入Windows系統中的用戶
?
?、?、打開 控制面板--選擇用戶賬戶--管理其他賬戶---選擇一個新賬戶,此時選擇fww用戶
?、荨⒃谳斎肟蛑袑懭雈ww,點擊 檢查名稱,則自動加入了全名
? ⑥、則在登錄名中自動代入了Windows用戶,點擊確定,則用戶添加成功。
⑦、斷開此時的連接
⑧、新建fww對應的連接,但是此時賬戶默認為Administrator,且為灰色,無法更改
?、?、按Alt+ Ctrl+Delete鍵,切換用戶
?、?、則Sqlserver的登錄賬戶則變為BalmyLee
?、輸入賬戶信息,則用戶登錄成功。
-
使用Transact-SQL 語句創建用戶
?、?、首先在 SQL Server 服務器級別,創建登陸帳戶(create login)
語法:
CREATE LOGIN 用戶名 PASSWORD='密碼' DEFAULT_DATABASE=數據庫;示例:
--創建登陸帳戶(create login) create login dba with password='abcd1234@', default_database=LibraryDB;?、?、創建數據庫用戶(create user)
語法:
CREATE USER 用戶名 FOR LOGIN 登錄用戶名 WITH DEFAULT_SCHEMA=數據庫;示例:
--為登陸賬戶創建數據庫用戶(create user),在mydb數據庫中的security中的user下可以找到新創建的dba create user dba for login dba with default_schema=LibraryDB并指定數據庫用戶“dba” 的默認 schema 是“LibraryDB”。這意味著 用戶“LibraryDB” 在執行“select * from t”,實際上執行的是 “select * from LibraryDB.t”。
③、通過加入數據庫角色,賦予數據庫用戶“dba”權限
語法:
?
格式:
--通過加入數據庫角色,賦予數據庫用戶“db_owner”權限 exec sp_addrolemember 'db_owner', 'dba'此時,dba 就可以全權管理數據庫 mydb 中的對象了。
如果想讓 SQL Server 登陸帳戶“dba”訪問多個數據庫,比如 mydb2。 可以讓 sa 執行下面的語句:
此時,dba 就可以有兩個數據庫 mydb, mydb2 的管理權限了!
?、?、完整的代碼示例
--創建數據庫mydb和mydb2--在mydb和mydb2中創建測試表,默認是dbo這個schema CREATE TABLE DEPT(DEPTNO int primary key,DNAME VARCHAR(14),LOC VARCHAR(13) );--插入數據 INSERT INTO DEPT VALUES (101, 'ACCOUNTING', 'NEW YORK'); INSERT INTO DEPT VALUES (201, 'RESEARCH', 'DALLAS'); INSERT INTO DEPT VALUES (301, 'SALES', 'CHICAGO'); INSERT INTO DEPT VALUES (401, 'OPERATIONS', 'BOSTON');--查看數據庫schema, user 的存儲過程 select * from sys.database_principals select * from sys.schemas select * from sys.server_principals--創建登陸帳戶(create login) create login dba with password='abcd1234@', default_database=mydb--為登陸賬戶創建數據庫用戶(create user),在mydb數據庫中的security中的user下可以找到新創建的dba create user dba for login dba with default_schema=dbo--通過加入數據庫角色,賦予數據庫用戶“db_owner”權限 exec sp_addrolemember 'db_owner', 'dba'--讓 SQL Server 登陸帳戶“dba”訪問多個數據庫 use mydb2 go create user dba for login dba with default_schema=dbo go exec sp_addrolemember 'db_owner', 'dba' go--禁用登陸帳戶 alter login dba disable --啟用登陸帳戶 alter login dba enable--登陸帳戶改名 alter login dba with name=dba_tom--登陸帳戶改密碼: alter login dba with password='aabb@ccdd'--數據庫用戶改名: alter user dba with name=dba_tom--更改數據庫用戶 defult_schema: alter user dba with default_schema=sales--刪除數據庫用戶: drop user dba--刪除 SQL Server登陸帳戶: drop login dba-
使用存儲過程創建用戶
下面一個實例來說明在sqlserver中如何使用存儲過程創建角色,重建登錄,以及如何為登錄授權等
/*--示例說明示例在數據庫InsideTSQL2008中創建一個擁有表HR.Employees的所有權限、擁有表Sales.Orders的SELECT權限的角色r_test隨后創建了一個登錄l_test,然后在數據庫InsideTSQL2008中為登錄l_test創建了用戶賬戶u_test同時將用戶賬戶u_test添加到角色r_test中,使其通過權限繼承獲取了與角色r_test一樣的權限最后使用DENY語句拒絕了用戶賬戶u_test對表HR.Employees的SELECT權限。經過這樣的處理,使用l_test登錄SQL Server實例后,它只具有表Sales.Orders的select權限和對表HR.Employees出select外的所有權限。 --*/USE InsideTSQL2008--創建角色 r_test EXEC sp_addrole 'r_test'--添加登錄 l_test,設置密碼為pwd,默認數據庫為pubs EXEC sp_addlogin 'l_test','a@cd123','InsideTSQL2008'--為登錄 l_test 在數據庫 pubs 中添加安全賬戶 u_test EXEC sp_grantdbaccess 'l_test','u_test'--添加 u_test 為角色 r_test 的成員 EXEC sp_addrolemember 'r_test','u_test'--用l_test登陸,發現在SSMS中找不到仍和表,因此執行下述兩條語句出錯。 select * from Sales.Orders select * from HR.Employees--授予角色 r_test 對 HR.Employees 表的所有權限 GRANT ALL ON HR.Employees TO r_test --The ALL permission is deprecated and maintained only for compatibility. --It DOES NOT imply ALL permissions defined on the entity. --ALL 權限已不再推薦使用,并且只保留用于兼容性目的。它并不表示對實體定義了 ALL 權限。--測試可以查詢表HR.Employees,但是Sales.Orders無法查詢 select * from HR.Employees--如果要收回權限,可以使用如下語句。(可選擇執行) revoke all on HR.Employees from r_test --ALL 權限已不再推薦使用,并且只保留用于兼容性目的。它并不表示對實體定義了 ALL 權限。--授予角色 r_test 對 Sales.Orders 表的 SELECT 權限 GRANT SELECT ON Sales.Orders TO r_test--用l_test登陸,發現可以查詢Sales.Orders和HR.Employees兩張表 select * from Sales.Orders select * from HR.Employees--拒絕安全賬戶 u_test 對 HR.Employees 表的 SELECT 權限 DENY SELECT ON HR.Employees TO u_test--再次執行查詢HR.Employees表的語句,提示:拒絕了對對象 'Employees' (數據庫 'InsideTSQL2008',架構 'HR')的 SELECT 權限。 select * from HR.Employees--重新授權 GRANT SELECT ON HR.Employees TO u_test--再次查詢,可以查詢出結果。 select * from HR.EmployeesUSE InsideTSQL2008 --從數據庫中刪除安全賬戶,failed EXEC sp_revokedbaccess 'u_test' --刪除角色 r_test,failed EXEC sp_droprole 'r_test' --刪除登錄 l_test,success EXEC sp_droplogin 'l_test'revoke 與 deny的區別
revoke:收回之前被授予的權限
deny:拒絕給當前數據庫內的安全帳戶授予權限并防止安全帳戶通過其組或角色成員資格繼承權限。比如UserA所在的角色組有inset權限,但是我們Deny UserA使其沒有insert權限,那么以后即使UserA再怎么到其他含有Insert的角色組中去,還是沒有insert權限,除非該用戶被顯示授權。
簡單來說,deny就是將來都不許給,revoke就是收回已經給予的。
示例:
GRANT INSERT ON TableA TO RoleA GO EXEC sp_addrolemember RoleA, 'UserA' -- 用戶UserA將有TableA的INSERT權限 GOREVOKE INSERT ON TableA FROM RoleA -- 用戶UserA將沒有TableA的INSERT權限,收回權限 GOGRANT INSERT ON TableA TORoleA --重新給RoleA以TableA的INSERT權限 GO DENY INSERT ON TableA TO UserA -- 雖然用戶UserA所在RoleA有TableA的INSERT權限,但UserA本身被DENY了,所以用戶UserA將沒有TableA的INSERT權限。?
轉載于:https://www.cnblogs.com/BalmyLee/p/10945979.html
總結
以上是生活随笔為你收集整理的MSSQL → 02:数据库结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到去厕所看到好多大便
- 下一篇: SQL like