THE5
數據庫的設計
一.需求分析階段
1. 收集對象
2. 標識對象
3. 標識每個對象的屬性
4. 標識對象之間的關係
二.詳細設計階段
1. 繪製E – R圖
2. 將E – R圖轉換爲表格
3. 應用三大範式規範表格
1st NF:每列原子性
2st NF: 除主鍵外的其他列都依賴於該主鍵 - - 都和主鍵相關
3st NF: 除主鍵外的其他列都不傳遞依賴於該主鍵 - - 都直接相關 無間接
訪問SQL表需要驗證
是否SQL SERVER帳戶
是否是該數據庫帳戶
是否有足夠的權限操作訪問該表
創建登錄
添加windows登錄帳戶
EXEC sp_grantlogin ‘域名\用戶名’
添加SQL登錄帳戶
EXEC sp_addlogin ‘用戶名’, ‘密碼’
創建數據庫用戶
EXEC sp_grantdbaccess ‘登錄帳戶名’, ‘數據庫用戶名’
注:數據庫用戶名爲默認數據,同用戶名一致
權限類型
GRANT:
在安全系統中創建項目,使當前數據庫中的用戶得以處理當前數據庫中的數據或執行特定的 Transact-SQL 語句。
1 例子:授予語句權限
下面的示例給用戶 Mary 和 John 授予多個語句權限。
GRANT CREATE DATABASE, CREATE TABLE TO Mary, John
授予全部語句權限給用戶Rose
GRANT ALL to Rose
2 例子:授予對象權限
GRANT SELECT ON authors TO public
GRANT INSERT, UPDATE, DELETE ON authors TO Mary, John, Tom
DENY:
在安全系統中創建一項,以拒絕給當前數據庫內的安全帳戶授予權限並防止安全帳戶通過其組或角色成員資格繼承權限。
1 例子:拒絕語句權限
下例對多個用戶拒絕多個語句權限。用戶不能使用 CREATE DATABASE 和 CREATE TABLE 語句
DENY CREATE DATABASE, CREATE TABLE TO Mary, John
對用戶Rose拒絕全部語句權限
DENY ALL to Rose
2 例子:拒絕對象權限
DENY INSERT, UPDATE, DELETE ON authors TO Mary, John, Tom
REVOKE:
刪除以前在當前數據庫內的用戶上授予或拒絕的權限。
1 廢除類似於拒絕,但是,廢除權限是刪除已授予的權限,並不妨礙用戶、組或角色從更高級別繼承已授予的權限。因此,如果廢除用戶查看錶的權限,不一定能防止用戶查看該表,因爲已將查看該表的權限授予了用戶所屬的角色。
2 角色是權限的一個集合,可以指派給用戶或其它角色。這樣只對角色進行權限設置便可以實現對多個用戶權限的設置
3 舉例:DENY與REVOKE區別
例如,從 HumanResources 角色中刪除 Employees 表上的 SELECT 訪問權限將廢除該權限,從而使 HumanResources 不能再使用該表。如果 HumanResources 是 Administration 角色的成員。如果以後將 Employees 上的 SELECT 權限授予了 Administration,則 HumanResources 的成員可以通過 Administration 中的成員資格看到該表。但是,如果對 HumanResources 拒絕SELECT權限,則即使以後向 Administration 授予權限,HumanResources 也不會繼承該權限
4 例子: 廢除授予用戶帳戶的語句權限
下例廢除已授予用戶 Joe 的 CREATE TABLE 權限。它刪除了允許 Joe 創建表的權限。不過,如果已將 CREATE TABLE 權限授予給了包含 Joe 的任何角色,那麼 Joe 仍可創建表。
REVOKE CREATE TABLE FROM Joe
5 例子: 廢除授予多個用戶帳戶的多個權限
下例廢除授予多個用戶的多個語句權限。
REVOKE CREATE TABLE, CREATE INDEX FROM Mary, John
6 例子: 廢除拒絕的權限
用戶 Mary 是 Budget 角色的成員,已給該角色授予了對 Budget_Data 表的 SELECT 權限。已對Mary 使用 DENY 語句以防止 Mary 通過授予 Budget 角色的權限訪問 Budget_Data 表
下例刪除對 Mary 拒絕的權限,並通過適用於 Budget 角色的 SELECT 權限,允許 Mary 對該表使用 SELECT 語句。
REVOKE SELECT ON Budget_Data TO Mary
THE6
使用變量
局部變量
局部變量以標記@爲前綴
局部變量爲先聲明再賦值
EXP:
DECLARE @name varchar(8)
SET @name = ‘edward’
全局變量
全局變量必須以標記@@爲前綴
全局變量由系統定義和維護,我們只能讀取,不能修改全局變量的值
EXP:
PRINT '當前SQL版本: ' + @@VERSION
邏輯控制語句
IF – ELSE語句
IF (條件)
BEGIN
語句1
語句2
… …
END
ELSE
BEGIN
語句1
語句2
… …
END
WHILE語句
WHILE (條件)
BEGIN
語句1
語句2
… …
BREAK
END
CASE語句
CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
… …
ELSE 其他結果
END
THE7
子查詢 EXISTS NOT EXISTS 聯接等語句的同功能替換
EXP:
SELECT * FROM stuInfo
WHERE EXISTS(SELECT * FROM stuMarks WHERE stuNo = stuInfo.stuNo)
使用IN子查詢改寫上述語句
SELECT * FROM stuInfo
WHERE stuNo IN (SELECT stuNo FROM stuMarks)
請使用連接改寫上述語句
SELECT * FROM stuInfo
INNER JOIN stuMarks ON stuInfo.stuNo = stuMarks.stuNo
事物
開始事物
BEGIN TRANSACTION
執行事物
COMMIT TRANSACTION
回滾事物
ROLLBACK TRANSACTION
判斷條件語句是否執行有錯誤
全局變量@@ERROR
因@@ERROR只能判斷前一條T-SQL語句的執行是否出錯,爲了判斷事物中語句是否有錯,需要使用自定義變量累加方法:
DECLARE @errorSum INT
SET @errorSum = @errorSum + @@ERROR
索引
CREATE [UNIQUE] [CLUSTERED | UNCLUSTERED] - -唯一索引 聚集索引 非聚集索引
INDEX index_name
ON table_name(columu_name)
[WITH FILLFACTOR= X] - -填充因子 0 - 100
EXP:
索引的創建
IF EXISTS(SELECT name FROM sysindexes
WHERE name = 引名)
DROP INDEX 表名. 索引名
GO
CREATE ...
視圖
CREATE VIEW view_name
AS
<select語句>
EXP:
IF EXISTS (SELECT * FROM sysobjects WHERE
Name = ‘視圖名’)
DROP VIEW 視圖名
GO
CREATE …