SQLServer復(fù)習(xí)筆記:數(shù)據(jù)庫編程番枚、數(shù)據(jù)庫安全法严、事務(wù)管理與并發(fā)控制、數(shù)據(jù)庫存儲管理與數(shù)據(jù)恢復(fù)

考前的一些復(fù)習(xí)整理葫笼,雖然考試考的會很淺深啤,但難得有機會認真的復(fù)習(xí)一下數(shù)據(jù)庫內(nèi)容……

游標(biāo) cursor

DECLARE cursor_name CURSOR FOR SELECT ...
OPEN cursor_name
FETCH FROM cursor_name INTO @v_1,@v_2...
WHILE @@FETCH_STATUS=0

失敗返回-1
沒有找到記錄返回100

CLOSE cursor_name
DEALLOCATE cursor_name

存儲過程

CREATE PROCEDURE proc_name 
@input ='default',@input...
AS 
SELECT ...
RETURN @output ...

DECLARE @in INT ...
EXECUTE @in = proc_name '','',...
EXECUTE @in = proc_name @input = '',...

如果是OUTPUT參數(shù)的話調(diào)用PROC時需要傳入數(shù)據(jù)對象

DECLARE @in INT, @avg INT
EXECUTE @in = proc_name @input = ' ',@avg = @avg OUTPUT

返回游標(biāo)

CREATE PROCDURE proc_name 
@cursor_out CURSOR OUTPUT
AS
SET @cursor_out = CURSOR FOR 
sql_statement
OPEN cursor_out 

觸發(fā)器

CREATE TRIGGER trigger_name ON
table_name
FOR/INSTEAD OF
INSERT/UPDATE/DELETE
sql_statement

動態(tài)SQL

DECLARE cursor_name DYNAMIC CURSOR FOR SQLSA
PREPARE SQLSA FROM @sql_statement  --通常為字符串變量
OPEN DYNAMIC cursor_name USING @parameter

數(shù)據(jù)庫安全
訪問控制

  • 用戶管理
  • 角色管理
  • 權(quán)限管理
  • 數(shù)據(jù)加密

存取控制

  • 定義用戶權(quán)限 被稱為安全規(guī)則或授權(quán)規(guī)則
  • 合法權(quán)限檢查 用戶發(fā)出請求后,查找數(shù)據(jù)字典通過安全規(guī)則進行檢查路星,如果超出權(quán)限則拒絕

用戶角色權(quán)限

  • 角色成為用戶的成員
  • 權(quán)限可以授權(quán)給用戶溯街,也可以授權(quán)給角色

自主存取控制

  • 用戶對于不同的數(shù)據(jù)對象(表)有不同的操作權(quán)限
  • 不同的用戶對于同一對象也有不同的操作權(quán)限,用戶可以將其存取權(quán)限轉(zhuǎn)授

強制存取控制
每一個數(shù)據(jù)對象被標(biāo)以密級洋丐,每個用戶被許可相應(yīng)的級別

建立登錄用戶

CREATE LOGIN zhang WITH PASSWORD = '....' {[ MUST_CHANGE ]
[,DEFAULT_DATABASE = database ]
[, CHECK_EXPIRATION = { ON | OFF}]}

盡管指定了默認數(shù)據(jù)庫苫幢,但是在成為該數(shù)據(jù)庫用戶前還是無法USE該數(shù)據(jù)庫。

修改用戶
ALTER LOGIN zhang DISABLE/ENABLE

  • 修改口令
    管理員:ALTER LOGIN zhang WITH PASSWORD='bistu'
    用戶自己:ALTER LOGIN zhang WITH PASSWORD='mis' OLD_PASSWORD='bistu'

刪除登錄用戶

DROP LOGIN login_name

數(shù)據(jù)庫用戶

CREATE USER user_name [LOGIN login_name]
[ WITH DEFAULT_SCHEMA = schema_name ]

默認架構(gòu)即訪問數(shù)據(jù)庫對象時可以省略架構(gòu)名

USE 倉儲訂貨
CREATE USER zhang WITH DEFAULT_SCHEMA =倉儲

沒有指定login則自動映射到同名login
在創(chuàng)建前USE數(shù)據(jù)庫垫挨,指定默認架構(gòu)韩肝,此時zhang成為了數(shù)據(jù)庫用戶,但在沒有得到操作授權(quán)前不能進行查詢和操作九榔。

游標(biāo) cursor

DECLARE cursor_name CURSOR FOR SELECT ...
OPEN cursor_name
FETCH FROM cursor_name INTO @v_1,@v_2...
WHILE @@FETCH_STATUS=0
--失敗返回-1
--沒有找到記錄返回100
CLOSE cursor_name
DEALLOCATE cursor_name

存儲過程

CREATE PROCEDURE proc_name 
@input ='default',@input...
AS 
SELECT ...
RETURN @output ...

DECLARE @in INT ...
EXECUTE @in = proc_name '','',...
EXECUTE @in = proc_name @input = '',...

如果是OUTPUT參數(shù)的話調(diào)用PROC時需要傳入數(shù)據(jù)對象

DECLARE @in INT, @avg INT
EXECUTE @in = proc_name @input = ' ',@avg = @avg OUTPUT

返回游標(biāo)

CREATE PROCDURE proc_name 
@cursor_out CURSOR OUTPUT
AS
SET @cursor_out = CURSOR FOR 
sql_statement
OPEN cursor_out 

觸發(fā)器

CREATE TRIGGER trigger_name ON
table_name
FOR/INSTEAD OF
INSERT/UPDATE/DELETE
sql_statement

動態(tài)SQL

DECLARE cursor_name DYNAMIC CURSOR FOR SQLSA
PREPARE SQLSA FROM @sql_statement  --通常為字符串變量
OPEN DYNAMIC cursor_name USING @parameter

數(shù)據(jù)庫安全
訪問控制

  • 用戶管理
  • 角色管理
  • 權(quán)限管理

數(shù)據(jù)加密

存取控制

  • 定義用戶權(quán)限 被稱為安全規(guī)則或授權(quán)規(guī)則
  • 合法權(quán)限檢查 用戶發(fā)出請求后哀峻,查找數(shù)據(jù)字典通過安全規(guī)則進行檢查涡相,如果超出權(quán)限則拒絕

用戶角色權(quán)限

  • 角色成為用戶的成員
  • 權(quán)限可以授權(quán)給用戶,也可以授權(quán)給角色

自主存取控制

  • 用戶對于不同的數(shù)據(jù)對象(表)有不同的操作權(quán)限
  • 不同的用戶對于同一對象也有不同的操作權(quán)限剩蟀,用戶可以將其存取權(quán)限轉(zhuǎn)授

強制存取控制
每一個數(shù)據(jù)對象被標(biāo)以密級催蝗,每個用戶被許可相應(yīng)的級別

建立登錄用戶

CREATE LOGIN zhang WITH PASSWORD = '....' {[ MUST_CHANGE ]
[,DEFAULT_DATABASE = database ]
[, CHECK_EXPIRATION = { ON | OFF}]}

盡管指定了默認數(shù)據(jù)庫,但是在成為該數(shù)據(jù)庫用戶前還是無法USE該數(shù)據(jù)庫育特。

修改用戶
ALTER LOGIN zhang DISABLE/ENABLE

修改口令

  • 管理員:ALTER LOGIN zhang WITH PASSWORD='bistu'
  • 用戶自己:ALTER LOGIN zhang WITH PASSWORD='mis' OLD_PASSWORD='bistu'

刪除登錄用戶
DROP LOGIN login_name

數(shù)據(jù)庫用戶

CREATE USER user_name [LOGIN login_name]
[ WITH DEFAULT_SCHEMA = schema_name ]

默認架構(gòu)即訪問數(shù)據(jù)庫對象時可以省略架構(gòu)名

USE 倉儲訂貨
CREATE USER zhang WITH DEFAULT_SCHEMA =倉儲

沒有指定login則自動映射到同名login
在創(chuàng)建前USE數(shù)據(jù)庫丙号,指定默認架構(gòu),此時zhang成為了數(shù)據(jù)庫用戶缰冤,但在沒有得到操作授權(quán)前不能進行查詢和操作犬缨。

數(shù)據(jù)庫用戶分類

  • 系統(tǒng)管理員
  • 數(shù)據(jù)庫管理員
  • 數(shù)據(jù)庫對象用戶 創(chuàng)建表、視圖等
  • 數(shù)據(jù)庫訪問用戶 可以操作被授權(quán)的數(shù)據(jù)庫對象(表棉浸、視圖等)

public角色

  • 每個數(shù)據(jù)庫(包括所有系統(tǒng)數(shù)據(jù)庫和所有用戶數(shù)據(jù)庫)都有public角色
    每個數(shù)據(jù)庫用戶都自動是public角色的成員
    public角色的權(quán)限是數(shù)據(jù)庫中所有用戶的默認權(quán)限
    或者說每個用戶都擁有的權(quán)限應(yīng)該來自public角色
    系統(tǒng)初始時public角色幾乎沒有任何默認的權(quán)限
    管理員應(yīng)該將所有用戶擁有的權(quán)限授予public角色

創(chuàng)建角色
CREATE ROLE role_name [ AUTHORIZATION owner_name ]
以sa登錄后直接執(zhí)行如下命令:

USE 倉儲訂貨
    CREATE ROLE manager

指定角色
sp_addrolemember @rolename='manager',@membername='huang'

sp_addrolemember 'manager','huang'
取消角色
sp_droprolemember @rolename='manager',@membername='huang'

修改角色名稱命令
ALTER ROLE role_name WITH NAME = new_name
例:將角色manager的名稱修改為orders_manager 怀薛。
ALTER ROLE manager WITH NAME = orders_manager

授予權(quán)限-對象權(quán)限

GRANT SELECT ON 基礎(chǔ).職工(職工號,倉庫號,姓名,班組長) TO public 
GRANT INSERT,UPDATE(經(jīng)手人,供貨方,訂購日期,金額),DELETE 
ON 訂貨.訂購單 TO order_man 
WITH GRANT OPTION
GRANT ... ON A.B TO ... AS ...
REVOKE GRANT OPTION FOR INSERT ON table FROM role
REVOKE INSERT ON table FROM role

架構(gòu)權(quán)限

GRANT INSERT/CONTROL ON SCHEMEA::name TO user
ALTER AUTHORIZATION ON SCHEMEA::name/table_name TO user/SCHEMA OWNER 
ALTER schema_to TRANSFER schema_from.table 

語句權(quán)限
CREATE TABLE/RULE
BACKUP 等

禁止權(quán)限
DENY X TO A

事務(wù)
在關(guān)系數(shù)據(jù)庫中,一個事務(wù)可以是一條SQL語句迷郑,一個SQL語句序列或整個程序枝恋。
事務(wù)的開始與結(jié)束可以由用戶顯式控制。如果用戶沒有顯式地定義事務(wù)則由DBMS按缺省規(guī)定自動劃分事務(wù)(隱式事務(wù))嗡害。
在SQL語言中焚碌,定義事務(wù)的語句有:
BEGIN TRANSACTION 定義事務(wù)開始
COMMIT 提交事務(wù)
ROLLBACK 回滾事務(wù)

事務(wù)的特性

  • 原子性(Atomicity):事務(wù)是數(shù)據(jù)庫工作的基本邏輯單位
  • 事務(wù)中包括的各操作要么全做,要么全不做霸妹;
  • 一致性(Consistency):事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)轉(zhuǎn)變到另一個一致性狀態(tài)呐能。
  • 隔離性(Isolation):一個事務(wù) 的執(zhí)行不能被其它事務(wù)干擾。
  • 持續(xù)性(Durability):一個事務(wù)一旦提交抑堡,它對數(shù)據(jù)庫數(shù)據(jù)的改變就應(yīng)是持久的摆出,即使系統(tǒng)發(fā)生故障也不影響其結(jié)果。

以上稱為事務(wù)的ACID特性首妖。

可能導(dǎo)致事務(wù)ACID特性被破壞的因素

  • 多個事務(wù)并發(fā)運行偎漫,不同事務(wù)的操作交叉執(zhí)行;
  • 事務(wù)在運行過程中被強行停止有缆。

數(shù)據(jù)恢復(fù)機制和并發(fā)控制機制的任務(wù)

  • 保證多個事務(wù)的交叉運行不影響這些事務(wù)的原子性象踊;
  • 保證被強行終止的事務(wù)不影響其它事務(wù)的執(zhí)行。

設(shè)置隱含事務(wù)方式的命令
SET IMPLICIT_TRANSACTIONS ON

取消隱含事務(wù)方式的命令
SET IMPLICIT_TRANSACTIONS OFF

基本的封鎖類型

  • 排它鎖(Exclusive Locks棚壁,簡稱X鎖)杯矩,又稱為寫鎖;
    若事務(wù)T對數(shù)據(jù)對象A加X鎖袖外,則只允許T讀取和修改A史隆,其他任何事務(wù)都不能再對A加任何類型的鎖,直到T釋放A上的鎖曼验。
    這保證了其他事務(wù)在T釋放A的鎖之前不能再讀取和修改A泌射。

  • 共享鎖(Share Locks粘姜,簡稱S鎖),又稱為讀鎖熔酷。
    若事務(wù)T對數(shù)據(jù)對象A加S鎖孤紧,則事務(wù)T可以讀A但不能修改A,其他事務(wù)只能再對A加S鎖拒秘,而不能加X鎖号显,直到T釋放A的S鎖。
    這就保證了其他事務(wù)可以讀A躺酒,但在T釋放A的S鎖之前不能對A做任何修改押蚤。

SQL Server的封鎖操作是在相關(guān)語句的“WITH (<table_hint>)”子句中完成的,該短語可以在SELECT阴颖、INSERT、UPDATE和DELETE等語句中指定表級鎖定的方式和范圍丐膝。

TABLOCK:對表施行共享封鎖量愧,在讀完數(shù)據(jù)后立刻釋放封鎖,此類封鎖可以避免讀“臟”數(shù)據(jù)帅矗,但不具有可重復(fù)讀的特性偎肃。
HOLDLOCK:與TABLOCK一起使用,可將共享鎖保留到事務(wù)完成浑此,而不是在讀完數(shù)據(jù)后立即釋放鎖累颂,這樣可以保證數(shù)據(jù)的可重復(fù)讀。
NOLOCK:不進行封鎖凛俱,此關(guān)鍵詞僅應(yīng)用于SELECT語句紊馏,這樣可能會讀取未提交事務(wù)的數(shù)據(jù),即有可能發(fā)生“臟”讀蒲犬。
TABLOCKX:對表實施獨占封鎖朱监。
UPDLOCK:對表中的指定元組實施更新封鎖;這時其它事務(wù)可以對同一表中的其它元組也實施更新封鎖原叮,但是不允許對表實施共享封鎖和獨占封鎖赫编。

建立冗余數(shù)據(jù)最常用的技術(shù)是數(shù)據(jù)轉(zhuǎn)儲和登錄日志文件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奋隶,一起剝皮案震驚了整個濱河市擂送,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唯欣,老刑警劉巖嘹吨,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異境氢,居然都是意外死亡躺苦,警方通過查閱死者的電腦和手機身腻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匹厘,“玉大人嘀趟,你說我怎么就攤上這事∮希” “怎么了她按?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炕柔。 經(jīng)常有香客問我酌泰,道長,這世上最難降的妖魔是什么匕累? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任陵刹,我火速辦了婚禮,結(jié)果婚禮上欢嘿,老公的妹妹穿的比我還像新娘衰琐。我一直安慰自己,他們只是感情好炼蹦,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布羡宙。 她就那樣靜靜地躺著,像睡著了一般掐隐。 火紅的嫁衣襯著肌膚如雪狗热。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天虑省,我揣著相機與錄音匿刮,去河邊找鬼。 笑死探颈,一個胖子當(dāng)著我的面吹牛僻焚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膝擂,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼虑啤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了架馋?” 一聲冷哼從身側(cè)響起狞山,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叉寂,沒想到半個月后萍启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年勘纯,在試婚紗的時候發(fā)現(xiàn)自己被綠了局服。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡驳遵,死狀恐怖淫奔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堤结,我是刑警寧澤唆迁,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站竞穷,受9級特大地震影響唐责,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘾带,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一鼠哥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧看政,春花似錦朴恳、人聲如沸源梭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽概龄。三九已至,卻和暖如春鸥拧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工谴垫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人母蛛。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓翩剪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彩郊。 傳聞我的和親對象是個殘疾皇子前弯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容