日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

数据库系统原理(第6章:数据库安全与保护)

發(fā)布時(shí)間:2023/12/13 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库系统原理(第6章:数据库安全与保护) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、數(shù)據(jù)庫完整性

數(shù)據(jù)庫完整性是指數(shù)據(jù)庫中數(shù)據(jù)的正確性和相容性。

完整性約束條件的作用對(duì)象

  • 列級(jí)約束: 包括對(duì)列的類型、取值范圍、精度等的約束
  • 元組約束: 指元組中各個(gè)字段之間的相互約束
  • 表級(jí)約束: 指若干元組、關(guān)系之間的聯(lián)系的約束

定義與實(shí)現(xiàn)完整性約束:實(shí)體完整性 、參照完整性、 用戶定義的完整性

**************************實(shí)體完整性**************************

實(shí)體完整性 :在MySQL中,實(shí)體完整性是通過主鍵約束和候選鍵約束實(shí)現(xiàn)的。

主鍵列必須遵守的規(guī)則

  • 每一個(gè)表只能定義一個(gè)主鍵
  • 主鍵的值(鍵值)必須能夠唯一標(biāo)志表中的每一行記錄,且不能為NULL
  • 復(fù)合主鍵不能包含不必要的多余列
  • 一個(gè)列名在復(fù)合主鍵的列表中只能出現(xiàn)一次

?

?

主鍵約束與候選鍵約束的區(qū)別?

  • 主鍵約束? ? ? ?一個(gè)表只能創(chuàng)建 一個(gè)主鍵? ? ?關(guān)鍵字 PRIMARY KEY
  • 候選鍵約束? ?可以定義 若干個(gè)候選鍵? ? ?關(guān)鍵字 UNIQUE

***********************參照完整性*******************************

REFERENCES tbl_name(index_col_name,…)[ON DELETE reference_option][ON UPDATE reference_option]

tbl_name:指定外鍵所參照的表名

index_col_name:指定被參照的列名

ON DELETE:指定參照動(dòng)作相關(guān)的SQL語句

reference_option:指定參照完整性約束的實(shí)現(xiàn)策略 (RESTRICT-限制策略 | CASCADE-級(jí)聯(lián)策略 | SET NULL-置空策略 | NO ACTION-不采取實(shí)施策略)

?

?

?

**********************用戶定義的完整性****************************

非空約束:NOT NULL

CHECK 約束:CHECK(expr)

命名完整性約束:CONSTRAINT [symbol]? ? symbol:指定的約束名字

只能給基于表的完整性約束指定名字,無法給基于列的完整性約束指定名字

命名完整性約束的方法是在各種完整性約束的定義說明之前加上關(guān)鍵字( CONSTRAINT )和該約束的名字

更新完整性約束

使用ALTER TABLE語句更新與列或表有關(guān)的各種約束。

  • 1、完整性約束不能直接被修改。(先刪除,再增加)
  • 2、使用ALTER TABLE語句,可以獨(dú)立地刪除完整性約束,而不會(huì)刪除表 本身。(DROP TABLE語句刪除一個(gè)表,則表中所有的完整性約束都會(huì)被 自動(dòng)刪除)

?

二、觸發(fā)器

什么是觸發(fā)器:是用戶定義在關(guān)系表上的一類由事件驅(qū)動(dòng)的數(shù)據(jù)對(duì)象, 也是一種保證數(shù)據(jù)完整性的方法。

*************************創(chuàng)建觸發(fā)器******************************

使用CREATE TRIGGER語句創(chuàng)建觸發(fā)器

CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_body

trigger_name:指定觸發(fā)器的名稱

trigger_time:指定觸發(fā)器被觸發(fā)的時(shí)刻?

trigger_event:指定觸發(fā)器的觸發(fā)事件

tbl_name:指定與觸發(fā)器相關(guān)聯(lián)的表名

FOR EACH ROW :指定對(duì)于受觸發(fā)事件影響的每一 行都要激活觸發(fā)器的動(dòng)作

trigger_body:指定觸發(fā)器動(dòng)作主體

例如:在數(shù)據(jù)庫mysql_test的表customers中創(chuàng)建一個(gè)觸發(fā)器 customers_insert_trigger,用于每次向表customers插入一行數(shù)據(jù)時(shí), 將用戶變量str的值設(shè)置為one customer added!

CREATE TRIGGER mysql_test.customers_insert_trigger AFTER INSERT-> ON mysql_test.customers FOR EACH ROW SET @str=‘one customer added!’

使用DROP語句刪除觸發(fā)器

語法:DROP TRIGGER [IF EXISTS][schema_name.]trigger_name

  • IF EXISTS:用于避免在沒有觸發(fā)器的 情況下刪除觸發(fā)器
  • schema_name:指定觸發(fā)器所在的數(shù)據(jù)庫的名稱
  • trigger_name:指定要?jiǎng)h除的觸發(fā)器名稱

例如:DROP TRIGGER IF EXISTS mysql_test.customers_insert_trigger;

使用觸發(fā)器

INSERT觸發(fā)器   DELETE觸發(fā)器   UPDATE觸發(fā)器

*******************INSERT觸發(fā)器***********************

在INSERT觸發(fā)器代碼內(nèi),可引用一個(gè)名為NEW(不區(qū)分大小寫)的虛擬 表,來訪問被插入的行。 在BEFORE INSERT觸發(fā)器中,NEW中的值可以被更新

例如:在數(shù)據(jù)庫mysql_test的表customers中重新創(chuàng)建觸發(fā)器 customers_insert_trigger,用于每次向表customers插入一行數(shù)據(jù)時(shí), 將用戶變量str的值設(shè)置為新插入客戶的id號(hào)。

CREATE TRIGGER mysql_test.customers_insert_trigger AFTER INSERT-> ON mysql_test.customers FOR EACH ROW SET @str=NEW.cust_id;

********************DELETE觸發(fā)器*************************

在DELETE觸發(fā)器代碼內(nèi),可引用一個(gè)名為OLD(不區(qū)分大小寫)的虛擬 表,來訪問被刪除的行。 OLD中的值全部是只讀的,不能被更新。

*******************UPDATE觸發(fā)器***************************

在UPDATE觸發(fā)器代碼內(nèi),可引用一個(gè)名為OLD(不區(qū)分大小寫)的虛擬 表,來訪問UPDATE語句執(zhí)行前的值,也可以引用一個(gè)名為NEW(不區(qū) 分大小寫)的虛擬表來訪問更新后的值

例如:在數(shù)據(jù)庫mysql_test的表customers中創(chuàng)建一個(gè)觸發(fā)器 customers_update_trigger,用于每次更新表customers時(shí),將該表中cust_address列 的值設(shè)置為cust_contact列的值。

CREATE TRIGGER mysql_test.customers_update_trigger BEFORE UPDATE-> ON mysql_test.customers FOR EACH ROW-> SET NEW.cust_address=OLD.cust_contact;

?

三、安全性與訪問控制

數(shù)據(jù)庫的安全性是指保護(hù)數(shù)據(jù)庫以防止不合法的使用而造成數(shù)據(jù)泄露、更 改或破壞,所以安全性對(duì)于任何一個(gè)DBMS來說都是至關(guān)重要的。

安全性與訪問控制:身份驗(yàn)證 、數(shù)據(jù)庫用戶權(quán) 限確認(rèn)

使用CREATE USER語句創(chuàng)建MySQL賬戶

語法:CREATE USER user? ?[IDENTIFIED BY [PASSWORD]’password’]

  • user格式:指定創(chuàng)建用戶賬號(hào) 格式:’user_name’@’host name’
  • IDENTIFIED BY:可選項(xiàng),指定用戶賬號(hào)對(duì)應(yīng)的口令
  • PASSWORD:可選項(xiàng),指定散列口令

例如:在MySQL服務(wù)器中添加兩個(gè)新的用戶,其用戶名分別為zhangsan 和lisi,他們的主機(jī)名均為localhost,用戶zhangsan的口令為123,用戶 lisi的口令為對(duì)明文456使用PASSWORD()函數(shù)加密返回的散列值。

CREATE USER ‘zhangsan’@’localhost’ IDENTIFIED BY123’,-> ‘lisi’@’localhost’ IDENTIFIED BY PASSWORD->*531E182E272080AB0740FE2F2D689DBE0146E04’;

使用DROP USER語句刪除用戶賬號(hào)

語法:DROP USER user [,user]…

例如:DROP USER lisi@localhost

使用RENAME USER語句修改用戶賬號(hào)

?

?

?例如:RENAME USER ‘zhangsan’@’localhost’ TO ‘wangwu’@’localhost’;

使用SET PASSWORD語句修改用戶登錄口令

SET PASSWORD [FOR user]={PASSWORD(‘new_password’)|’encrypted password’}

例如:SET PASSWORD FOR 'username'@'localhost' = PASSWORD('pass');

使用GRANT語句為用戶授權(quán)

GRANTpriv_type [(column_list)][,priv_type [(column_list)]] …ON [object_type] priv_levelTO user_specification [,user_specification][WITH GRANT OPTION]
  • priv_type:用于指定權(quán)限的名稱
  • column_list:用于指定權(quán)限要授予給表中哪些具體的列
  • object_type:用于指定權(quán)限授予的對(duì)象類型
  • priv_level:用于指定權(quán)限授予的級(jí)別
  • TO:用于設(shè)定用戶的口令,以及指定 被授予權(quán)限的用戶user
  • user_specification:user[IDENTIFIED BY [PASSWORD]’password’]
  • WITH :可選項(xiàng),用于實(shí)現(xiàn)權(quán)限的轉(zhuǎn)移或限制

例如:授予用戶zhangsan在數(shù)據(jù)庫mysql_test的表customers上擁有對(duì) 列cust_id和列cust_name的SELECT權(quán)限。

GRANT SELECT(cust_id,cust_name)-> ON mysql_test.customers-> TO’zhangsan’@’localhost’;

授予當(dāng)前系統(tǒng)中一個(gè)不存在的用戶liming和用戶huang,要求創(chuàng)建 這兩個(gè)用戶,并設(shè)置對(duì)應(yīng)的系統(tǒng)登錄口令,同時(shí)授予他們?cè)跀?shù)據(jù)庫 mysql_test的表customers上擁有SELECT和UPDATE的權(quán)限。

GRANT SELECT,UPDATE -> ON mysql_test.customers -> TO 'liming'@'localhost' IDENTIFIED BY '123', -> 'huang'@'localhost' IDENTIFIED BY '789';

授予系統(tǒng)中已存在的wangwu可以在數(shù)據(jù)庫mysql_test中執(zhí)行所有 數(shù)據(jù)庫操作的權(quán)限

GRANT ALL-> ON mysql_test.*-> TO ‘wangwu’@’localhost’;

授予系統(tǒng)中已存在的wangwu擁有創(chuàng)建用戶的權(quán)限

GRANT CREATE USER-> ON *.*-> TO ‘wangwu’@’localhost’;

權(quán)限的轉(zhuǎn)移

授予當(dāng)前系統(tǒng)中不存在的用戶 zhou 在數(shù)據(jù)庫mysql_test的表customers上 擁有SELECT和UPDATE的權(quán)限,并允許其可以將自身的這個(gè)權(quán)限授予給其他 用戶

GRANT SELECT,UPDATE-> ON mysql_test.customers-> TO ‘zhou’@’localhost’ IDENTIFIED BY123-> WITH GRANT OPTION;

使用REVOKE語句撤銷用戶權(quán)限

REVOKEpriv_type [(column_list)][,priv_type [(column_list)]] …ON [object_type] priv_levelFROM user [,user]

回收系統(tǒng)中已存在用戶zhou在數(shù)據(jù)庫mysql_test的表customers 上的SELECT權(quán)限

REVOKE SELECT-> ON mysql_test.customers-> FROM ‘zhou’@’localhost’;

?

四、事務(wù)與并發(fā)控制

所謂事務(wù)是用戶定義的一個(gè)數(shù)據(jù)操作序列,這些操作可作為一個(gè)完整的工 作單元,要么全部執(zhí)行,要么全部不執(zhí)行,是一個(gè)不可分割的工作單位。 事務(wù)中的操作一般是對(duì)數(shù)據(jù)的更新操作,包括增、刪、改。

?

?以BEGIN TRANSACTION語句開始 以 COMMIT 語句或? ROLLBACK語句結(jié)束

事務(wù)的特征(ACID):

  • 原子性 Atomicity:事務(wù)是不可分割的最小工作單位
  • 一致性 Consistenc y:
  • 隔離性 Isolation:
  • 持續(xù)性(永久性) Durability

例題:依據(jù)事務(wù)的ACID特征,分析并編寫銀行數(shù)據(jù)庫系統(tǒng)中的轉(zhuǎn)賬事務(wù)T:從賬 戶A轉(zhuǎn)賬S金額資金到賬戶B

BEGIN TRANSACTION read(A); A=A-S; write(A); If(A<0)ROLLBACK; else read(B);B=B+Swrite(B);COMMIT;}

并發(fā)操作問題

  • 丟失更新 ? 事務(wù)T1,T2同時(shí)讀入同一數(shù)據(jù)并加以修改,T2的提交結(jié)果會(huì)破壞T1提交的結(jié)果
  • 不可重復(fù)讀 ? 事務(wù)T1讀取數(shù)據(jù)后,事務(wù)T2執(zhí)行更新操作,使T1無法再現(xiàn)前一次讀取結(jié)果
  • 讀“臟”數(shù)據(jù) ? 事務(wù)T1修改數(shù)據(jù)后撤銷,使得T2讀取的數(shù)據(jù)與數(shù)據(jù)庫中不一致

封鎖是最常用的并發(fā)控制技術(shù) 基本思想:需要時(shí),事務(wù)通過向系統(tǒng)請(qǐng) 求對(duì)它所希望的數(shù)據(jù)對(duì)象加鎖,以確保 它不被非預(yù)期改變

鎖 :一個(gè)鎖實(shí)質(zhì)上就是允許或阻止一個(gè)事務(wù)對(duì)一個(gè)數(shù)據(jù)對(duì)象的存取特權(quán)。

基本的封鎖類型:

  • 1、排他鎖(X鎖),用于寫操作
  • 2、共享鎖(S鎖),用于讀操作

封鎖的工作原理:

  • 1.若事務(wù)T對(duì)數(shù)據(jù)D加了X鎖,則所有別的事務(wù)對(duì)數(shù)據(jù)D的鎖請(qǐng)求都必須等 待直到事務(wù)T釋放鎖。
  • 2.若事務(wù)T對(duì)數(shù)據(jù)D加了S鎖,則別的事務(wù)還可對(duì)數(shù)據(jù)D請(qǐng)求S鎖,而對(duì)數(shù)據(jù) D的X鎖請(qǐng)求必須等待直到事務(wù)T釋放鎖。
  • 3.事務(wù)執(zhí)行數(shù)據(jù)庫操作時(shí)都要先請(qǐng)求相應(yīng)的鎖,即對(duì)讀請(qǐng)求S鎖,對(duì)更新 請(qǐng)求X鎖。這個(gè)過程一般是由DBMS在執(zhí)行操作時(shí)自動(dòng)隱含地進(jìn)行。
  • 4.事務(wù)一直占有獲得的鎖直到結(jié)束時(shí)釋放

封鎖的粒度

  • 我們通常以粒度來描述封鎖的數(shù)據(jù)單元的大小
  • DBMS可以決定不同粒度的鎖 粒度越細(xì),并發(fā)性就越大,但軟件復(fù)雜性和系統(tǒng)開銷也就越大。

封鎖的級(jí)別又稱為一致性級(jí)別或隔離度

  • 0級(jí)封鎖:不重寫其他非0級(jí)封鎖事務(wù)的未提交的更新數(shù)據(jù)。(實(shí)用價(jià)值低)
  • 1級(jí)封鎖:不允許重寫未提交的更新數(shù)據(jù)。防止了丟失更新的發(fā)生
  • 2級(jí)封鎖:既不重寫也不讀未提交的更新數(shù)據(jù)(防止了讀臟數(shù)據(jù))
  • 3級(jí)封鎖:不讀未提交的更新數(shù)據(jù),不寫任何(包括讀操作)未提交數(shù)據(jù)。

死鎖和活鎖

  • 活鎖——先來先服務(wù)
  • 死鎖——預(yù)防 (1)一次性鎖請(qǐng)求 (2)鎖請(qǐng)求排序 (3)序列化處理 (4)資源剝奪

可串行性

  • 一組事務(wù)的一個(gè)調(diào)度就是它們的基本操作的一種排序。
  • 在數(shù)據(jù)庫系統(tǒng)中,可串行性就是并發(fā)執(zhí)行的正確性準(zhǔn)則,即當(dāng)且當(dāng)一組事務(wù) 的并發(fā)執(zhí)行調(diào)度是可串行化的,才認(rèn)為它們是正確的。

兩段封鎖法

  • 1.發(fā)展(Growing)或加鎖階段
  • 2.收縮(Shrinking)或釋放鎖階段

五、備份與恢復(fù)?

數(shù)據(jù)丟失的途徑:

1.計(jì)算機(jī)硬件故障

2.計(jì)算機(jī)軟件故障

3.病毒

4.人為誤操作

5.自然災(zāi)害

6.盜竊

數(shù)據(jù)庫備份與恢復(fù)的概念

  • 數(shù)據(jù)備份是指通過導(dǎo)出數(shù)據(jù)或者復(fù)制表文件的方式來制作數(shù)據(jù)庫的復(fù)本;
  • 數(shù)據(jù)庫恢復(fù)則是當(dāng)數(shù)據(jù)庫出現(xiàn)故障或遭到破壞時(shí),將備份的數(shù)據(jù)庫加載到 系統(tǒng),從而使數(shù)據(jù)庫從錯(cuò)誤狀態(tài)恢復(fù)到備份時(shí)的正確狀態(tài)。 數(shù)據(jù)庫的恢復(fù)是以備份為基礎(chǔ)的,它是與備份相對(duì)應(yīng)的系統(tǒng)維護(hù)和管理操 作。

使用SELECT INTO…OUTFILE語句備份數(shù)據(jù)

SELECT *INTO OUTFILE ‘file_name’ export_options| INTO DUMPFILE ‘file_name

file_name:指定數(shù)據(jù)備份文件的名稱

?

使用LOAD DATA…INFILE語句恢復(fù)數(shù)據(jù)

?

簡(jiǎn)述恢復(fù)數(shù)據(jù)的方法?

備份數(shù)據(jù)庫mysql_test中表customers的全部數(shù)據(jù)到c盤的BACKUP目錄 下一個(gè)名為backupfile.txt的文件中,要求字段值如果是字符則用雙引號(hào) 標(biāo)注,字段值之間用逗號(hào)隔開,每行以問號(hào)為結(jié)束標(biāo)志。然后,將備份后 的數(shù)據(jù)導(dǎo)入到一個(gè)和customers表結(jié)構(gòu)相同的空表customers_copy中。

SELECT * FROM mysql_test.customers INTO OUTFILE ‘C:/BACKUP/backupfile.txt’ FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY “” LINES TERMINATED BY ‘?’;

?

轉(zhuǎn)載于:https://www.cnblogs.com/jalja/p/11614085.html

總結(jié)

以上是生活随笔為你收集整理的数据库系统原理(第6章:数据库安全与保护)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。