1. 程式人生 > >《SQL Server 2008從入門到精通》20180627

《SQL Server 2008從入門到精通》20180627

t-sql 插入數據 刪除 利用 擁有 AS 數據庫範式 臨時性 區別

數據庫範式理論

範式理論是為了建立冗余較小結構合理的數據庫所遵循的規則。關系數據庫中的關系必須滿足不同的範式。目前關系數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、BCNF、第四範式(4NF)、第五範式(5NF)

第一範式

對象的任意屬性不能被拆分,每個屬性有且僅有一個值,即沒有重復的行,沒有重復的列。

第二範式

在第一範式的基礎上,要求所有非主屬性都與主屬性完全相關。假設屬性1和屬性2為主屬性,屬性3為非主屬性,如果屬性1或者屬性2能唯一確定屬性3,則不符合2NF,只有(屬性1+屬性2)能唯一確定屬性3(有助於數據庫基礎性操作的實現)才符合2NF

第三範式

在第二範式的基礎上,要求除主鍵外其他字段不相關,不存在依賴性。比如一張表中非主屬性1,2,3,屬性1=屬性2-屬性3,則該表不滿足第三範式。(不要在數據庫中存儲可以簡單計算得出的數據)

BCNF

在第三範式基礎上,要求表中所有字段(包括主鍵)都互不相關,不存在依賴性。即主屬性不依賴於主屬性。

第四範式

表內不存在多對多關系。如果A和B是1:N的關系,A和C是1:N的關系,B和C互相獨立,則不滿足第四範式。

第五範式

在第四範式的基礎上,可以分解成更小的表。從最終結構重新建立原始結構。

Transact-SQL行構造器

例:用INSERT語句一次性插入多行數據

CREATE TABLE a(
    Column1 NVARCHAR(max),
    Column2 NVARCHAR(max)
);
Go
INSERT INTO a VALUES(‘1’,’1’),(‘2’,’2’),(‘3’,’3’);

用存儲過程新建登錄名和用戶名

創建登錄名huyan1,密碼111111,默認數據庫test,切換到test數據庫下,創建登錄名huyan1在test數據庫中的用戶hy1

EXECUTE sp_addlogin ‘huyan1’,’111111’,’test’
USE test
EXEC sp_adduser ‘huyan1‘,‘hy1‘

或使用sp_grantdbaccess創建一個與登錄名相同的數據庫用戶名。

EXEC sp_addlogin ‘hy2‘;
GO
USE test
EXEC sp_grantdbaccess ‘hy2‘

註:僅創建登錄名而沒有創建數據庫用戶名,該登錄名無法正常登錄數據庫。可以使用sql語句創建數據庫用戶名,或者右鍵登錄名—屬性—用戶映射中勾選數據庫。創建和刪除數據庫用戶名語句必須在該數據庫下執行。用戶名hy1默認權限public。

刪除新建的登錄名:

EXECUTE sp_droplogin ‘huyan1’

刪除新建的用戶名:

USE test;
EXECUTE sp_dropuser ‘hy1’

用戶權限

主要語句

USE test;
GRANT SELECT,UPDATE,DELETE
ON Customers
TO huyan1

REVOKE SELECT,UPDATE,DELETE
ON Customers
TO huyan1

註: GRANT語句必須在目標數據庫下執行。

授予用戶權限的前提

(1)創建登錄名huyan1,密碼111111,默認數據庫test

EXCUTE sp_addlogin ‘huyan1’,’111111’,’test’

(2)在huyan1登錄名的目標數據庫test下創建用戶hy

USE test;
CREATE USER hy FOR LOGIN huyan1 WITH DEFAULT_SCHEMA=test;

或者右鍵點擊huyan1登錄名,在屬性—用戶映射中勾選test數據庫,系統會自動在test數據庫下添加huyan1的用戶

授予權限

USE test;
GRANT SELECT,UPDATE,DELETE
ON Customers
TO hy

註:這裏的hy指的是數據庫用戶名而非登錄名。

撤銷權限

撤銷用戶hy在Customers表中的SELECT,UPDATE,DELETE權限

USE test;
REVOKE SELECT,UPDATE,DELETE
ON Customers
TO hy

拒絕權限

拒絕用戶hy在Customers表中的DELETE權限

USE test;
DENY DELETE
ON Customers
TO hy

註:REVOKE和DENY的區別在於,用戶權限被DENY後無法通過其組或角色成員身份繼承該權限,而權限被REVOKE後還可以通過繼承和授予得到。

創建角色並分配給用戶

在test數據庫下,用存儲過程創建角色p_test,該角色的所有者為hy。為p_test角色授予Customers表的所有權限。用存儲過程為角色p_test分配成員用戶hy。

USE test
EXEC sp_addrole ‘p_test’,’hy’;
GRANT ALL ON Customers TO p_test;
EXEC sp_addrolemember ‘p_test’,’hy’;

註:角色所有者hy並不是角色成員。用EXEC sp_addrole ‘p_test’,’hy’語句創建角色p_test並設置所有者為hy,並不代表hy是p_test的成員,擁有p_test角色的權限。

為角色p_test移除成員hy

EXEC sp_droprolemember ‘p_test’,’hy’;

服務器角色

bulkadmin:允許運行BULK INSERT語句,用於從文本中大量插入數據到數據庫中
dbcreator:允許創建,修改,刪除和還原任何數據庫,適用於助理DBA和開發人員
diskadmin:允許管理磁盤文件,比如鏡像數據庫和添加備份設備,適用於助理DBA
processadmin:允許多任務化的管理,可以通過多個進程做多件事情,也可以刪除進程
securityadmin:安全管理員,管理登錄名及其屬性
serveradmin:服務管理員,更改服務器的配置選項和關閉服務器
setupadmin:管理鏈接服務器,控制啟動的存儲過程
sysadmin:有權執行任何任務,僅適用於數據庫管理員

數據庫角色

標準角色

允許用戶適用單一的權限來創建角色。如創建一個叫User的角色,允許用戶INSERT,SELECT,UPDATE數據庫中的指定表,不允許其他任務。

應用程序角色

允許用戶為特定應用程序創建密碼保護

預定義數據庫角色

這些角色是內置的,不能被更改權限
(1) db_owner:可以做其他角色能做的所有事情,還可以做一些管理性操作
(2) db_accessadmin:可以通過添加或刪除用戶指定誰可以訪問數據庫
(3) db_securityadmin:可以修改角色成員身份和管理權限
(4) db_dlladmin:可以在數據庫中運行所有DLL命令,創建修改和刪除數據庫對象而不必瀏覽其數據
(5) db_backupoperator:備份數據庫
(6) db_datareader:讀取所有用戶所有表中的數據
(7) db_datawriter:可以添加更改刪除所有用戶所有表中的數據
(8) db_denydatareader:不能讀取任何用戶任何表中的數據
(9) db_denydatawriter:不能對任何用戶任何表中的數據做添加更改刪除的操作
(10) public:每個數據庫用戶都屬於public角色,未對用戶授予權限時該用戶將繼承public權限。該角色不能被刪除。

系統數據庫

master數據庫

存儲了登錄名和用戶ID所屬角色,系統配置,數據庫名和初始化信息,是最重要的數據庫。

model數據庫

存儲了創建數據庫時的一些預定義標準如數據庫初始大小,特定信息集等,是tempdb數據庫的基礎。

tempdb數據庫

臨時性數據庫,在sql server2008啟動時新建,在sql server2008關閉時丟失。主要存儲用戶建立的臨時表和臨時存儲過程。

msdb數據庫

給sql server2008提供必要的信息來運行作業。

數據庫文件和日誌

主數據文件

一個數據庫對應一個主數據文件,擴展名為.mdf,包含數據庫的啟動信息並指其他文件,用戶數據和對象可存儲在主數據文件中,也可以存儲在輔助數據文件中。

輔助數據文件

可選的,由用戶定義存儲用戶數據的文件,擴展名為.ndf,當數據庫超過單個Windows文件的最大限制,可使用輔助數據文件將數據分散到多個磁盤上,使數據庫能夠繼續增長。

事務日誌文件

保存了用於恢復數據庫的日誌信息,每個數據庫必須至少有1個日誌文件。擴展名為.ldf。

數據庫快照(database snapshot)

數據庫快照是源數據庫的靜態只讀視圖,與源數據庫位於同一服務器實例上,與源數據庫在事務上一致,源數據庫更新時,數據庫快照也將更新。一個數據庫可以存在多個數據庫快照。

優點

(1) 用於報告目的。客戶端可以查詢數據庫快照,以便利用創建快照時的數據編寫報表。
(2) 用於保存歷史數據以生成報表。數據庫快照保留了某個時間點的歷史數據,方便用戶日後對該時間點的歷史數據生成報表。
(3) 通過帶有鏡像數據庫的數據庫快照來訪問鏡像數據庫,釋放主體數據庫上的資源。
(4) 使數據免受管理失誤帶來的影響
(5) 如果源數據庫上出現用戶錯誤,可以將數據庫恢復到創建數據庫快照時的狀態。
(6) 管理測試數據庫。在第一輪測試開始前,對測試數據庫創建數據庫快照。在測試結束後可利用數據庫快照將數據庫恢復到測試前的狀態,以便重新開始測試。

註:數據庫快照與源數據庫相關,且無法對脫機和損壞的數據庫進行恢復,不能替代備份和還原。所有恢復模式都支持數據庫快照。

數據庫快照的限制

(1) 數據庫快照存在期間,不能對源數據庫進行分離,還原和刪除操作,但可以備份。
(2) 每次更新源數據庫時都會對快照進行“寫入時復制”操作,源數據庫的I/O性能受到影響。
(3) 不能從源數據庫或任何快照中刪除文件。
(4) 必須與源數據庫在同一個服務器實例上創建和保存。
(5) 依賴於源數據庫,但不是冗余存儲,無法防止磁盤錯誤或其他類型的損壞。
(6) 快照更新時用盡磁盤空間或遇到其他錯誤,則成為可以快照,必須刪除。
(7) 快照只讀,無法升級,因此升級後不可用。
(8) 無法對model數據庫,tempdb數據庫,master數據庫創建快照。
(9) 不能附加,分離,備份,還原數據庫快照,不能對數據庫快照中的文件進行刪除。
創建數據庫快照的唯一方式是使用Transact-SQL語句。且Microsoft SQL Server Management Studio不支持數據庫快照。

創建數據庫快照

CREATE DATABASE test_snapshot_201806271505 ON
(
    NAME=test,
    FILENAME=‘C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test_snapshot_201806271505.ss‘
)AS SNAPSHOT OF test;
GO

上述代碼中,test_snapshot_201806271505是快照名稱,NAME=test中的test是源數據庫的邏輯名稱,可右鍵數據庫—屬性—文件查看。FILENAME中填寫的是快照的稀疏文件存儲路徑,其中test_snapshot_201806271505.ss是稀疏文件的名稱,最後一個test是源數據庫名稱(並非邏輯名稱)。

註:實際在SQL Server Management Studio中運行上述語句創建數據庫快照,並未運行成功。
消息1844,級別16,狀態1,第1 行
Express Edition with Advanced Services (64-bit) 不支持Database Snapshot。

恢復數據庫快照

USE master
RESTORE DATABASE test FROM
DATABASE_SNAPSHOT=‘test_snapshot_201806271505‘;
GO

上述代碼中,test是源數據庫名稱,test_snapshot_201806271505是快照名稱。

刪除數據庫快照

DROP DATABASE test_snapshot_201806271505;

註:用數據庫快照恢復數據庫時,源數據庫不能存在多個快照,也不能存在任何只讀或壓縮文件組,創建快照時聯機現在脫機的文件。

創建和修改數據庫

創建數據庫

CREATE DATABASE 教務管理系統
ON(
    NAME=‘教務管理系統_DATA‘,
    FILENAME=‘E:\教務管理系統_DATA.mdf‘,
    SIZE=5MB,
    MAXSIZE=10MB,
    FILEGROWTH=5%
)
LOG ON(
    NAME=‘教務管理系統_LOG‘,
    FILENAME=‘E:\教務管理系統_LOG.ldf‘,
    SIZE=2MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB
)

修改數據庫名稱

ALTER DATABASE 教務管理系統 MODIFY NAME=database_name;

或者使用存儲過程

EXEC sp_renamedb ‘database_name‘,‘School_MIS‘;

修改數據庫大小

可以通過為數據庫新增一個次要數據庫文件實現增大數據庫容量

ALTER DATABASE School_MIS
ADD FILE(
    NAME=‘School_MIS1‘,
    FILENAME=‘E:\School_MIS1.mdf‘,
    SIZE=3MB,
    MAXSIZE=10MB,
    FILEGROWTH=10%
)

上述代碼中將新增的次要文件命名為School_MIS1,存儲路徑為E:\School_MIS1.mdf,初始大小為3MB,增長的最大限制為10MB,自動增長的增量為10%

查看數據庫狀態

(1) 通過查詢master表中的sys.databases視圖的state_desc列值來查看數據庫狀態,查詢條件是數據庫名稱name

SELECT state_desc FROM sys.databases
WHERE name=‘test‘

(2) 通過使用DATABASEPROPERTYEX()函數的STATUS屬性來查看狀態

USE test
GO
SELECT DATABASEPROPERTYEX(‘test‘,‘STATUS‘) AS ‘當前數據庫狀態‘;

SQL Server 2008提供了多種方法來查看數據庫信息,如使用master數據庫中的sys.database_files查看數據庫文件信息,sys.filegroups查看數據庫組的信息,sys.maste_files查看數據庫文件基本信息和狀態信息。除了目錄視圖和函數,還可以通過存儲過程sp_spaceused查看數據庫使用和保留的空間。

USE test
GO
EXEC sp_spaceused;

使用sp_helpdb查看數據庫基本信息

EXEC sp_helpdb ‘test‘;

分離和附加數據庫

分離數據庫

將數據庫從SQL Server實例中刪除,但使數據庫在其數據文件和事務日誌文件中保持不變,之後就可以使用這些文件將數據庫附加到任意SQL Server實例。
下列情況不能分離數據庫:
已復制並發布的數據庫不能分離,如果數據庫已發布,必須通過運行sp_replicationdboption禁用發布後才能分離。
如果數據庫中存在快照,必須刪除所有快照才能進行分離。
該數據庫正在某個數據庫鏡像會話中進行鏡像。
數據庫處於可以狀態不能分離。
數據庫是系統數據庫不能進行分離。

分離數據庫命令

USE master
EXEC sp_detach_db ‘test‘;

附加數據庫

利用分離出的數據文件和事務日誌文件將數據庫附加到其他服務器實例。可以附加復制的和分離的數據庫。

附加數據庫命令

無日誌附加數據庫命令
CREATE DATABASE test ON(
    FILENAME=‘C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test.mdf‘ 
)FOR ATTACH_REBUILD_LOG;
多個.mdf,.ndf,.ldf文件附加數據庫命令
CREATE DATABASE School_MIS ON(
FILENAME=‘E:\教務管理系統_DATA.mdf‘),
(FILENAME=‘E:\School_MIS1.mdf‘),
(FILENAME=‘E:\test_data.ndf‘
)LOG ON(
FILENAME=‘E:\教務管理系統_LOG.ldf‘
)FOR ATTACH;
存儲過程附加數據庫命令
EXEC sp_attach_db @dbname=‘School_MIS‘,
@filename1=‘E:\教務管理系統_DATA.mdf‘,
@filename2=‘E:\School_MIS1.mdf‘,
@filename3=‘E:\test_data.ndf‘,
@filename4=‘E:\教務管理系統_LOG.ldf‘;

《SQL Server 2008從入門到精通》20180627