數據庫系統原理(第6章:數據庫安全與保護)

一、數據庫完整性

數據庫完整性是指數據庫中數據的正確性和相容性。

完整性約束條件的作用對象

  • 列級約束: 包括對列的類型、取值范圍、精度等的約束
  • 元組約束: 指元組中各個字段之間的相互約束
  • 表級約束: 指若干元組、關系之間的聯系的約束

定義與實現完整性約束:實體完整性 、參照完整性、 用戶定義的完整性

**************************實體完整性**************************

實體完整性 :在MySQL中,實體完整性是通過主鍵約束和候選鍵約束實現的。

主鍵列必須遵守的規則

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

?

?

主鍵約束與候選鍵約束的區別?

  • 主鍵約束? ? ? ?一個表只能創建 一個主鍵? ? ?關鍵字 PRIMARY KEY
  • 候選鍵約束? ?可以定義 若干個候選鍵? ? ?關鍵字 UNIQUE

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

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

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

index_col_name:指定被參照的列名

ON DELETE:指定參照動作相關的SQL語句

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

?

?

?

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

非空約束:NOT NULL

CHECK 約束:CHECK(expr)

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

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

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

更新完整性約束

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

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

?

二、觸發器

什么是觸發器:是用戶定義在關系表上的一類由事件驅動的數據對象, 也是一種保證數據完整性的方法。

*************************創建觸發器******************************

使用CREATE TRIGGER語句創建觸發器

CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_body

trigger_name:指定觸發器的名稱

trigger_time:指定觸發器被觸發的時刻?

trigger_event:指定觸發器的觸發事件

tbl_name:指定與觸發器相關聯的表名

FOR EACH ROW :指定對于受觸發事件影響的每一 行都要激活觸發器的動作

trigger_body:指定觸發器動作主體

例如:在數據庫mysql_test的表customers中創建一個觸發器 customers_insert_trigger,用于每次向表customers插入一行數據時, 將用戶變量str的值設置為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語句刪除觸發器

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

  • IF EXISTS:用于避免在沒有觸發器的 情況下刪除觸發器
  • schema_name:指定觸發器所在的數據庫的名稱
  • trigger_name:指定要刪除的觸發器名稱

例如:DROP TRIGGER IF EXISTS mysql_test.customers_insert_trigger;

使用觸發器

INSERT觸發器   DELETE觸發器   UPDATE觸發器

*******************INSERT觸發器***********************

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

例如:在數據庫mysql_test的表customers中重新創建觸發器 customers_insert_trigger,用于每次向表customers插入一行數據時, 將用戶變量str的值設置為新插入客戶的id號。

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

********************DELETE觸發器*************************

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

*******************UPDATE觸發器***************************

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

例如:在數據庫mysql_test的表customers中創建一個觸發器 customers_update_trigger,用于每次更新表customers時,將該表中cust_address列 的值設置為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;

?

三、安全性與訪問控制

數據庫的安全性是指保護數據庫以防止不合法的使用而造成數據泄露、更 改或破壞,所以安全性對于任何一個DBMS來說都是至關重要的。

安全性與訪問控制:身份驗證 、數據庫用戶權 限確認

使用CREATE USER語句創建MySQL賬戶

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

  • user格式:指定創建用戶賬號 格式:’user_name’@’host name’
  • IDENTIFIED BY:可選項,指定用戶賬號對應的口令
  • PASSWORD:可選項,指定散列口令

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

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

使用DROP USER語句刪除用戶賬號

語法:DROP USER user [,user]…

例如:DROP USER lisi@localhost

使用RENAME USER語句修改用戶賬號

?

?

?例如: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語句為用戶授權

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

例如:授予用戶zhangsan在數據庫mysql_test的表customers上擁有對 列cust_id和列cust_name的SELECT權限。

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

授予當前系統中一個不存在的用戶liming和用戶huang,要求創建 這兩個用戶,并設置對應的系統登錄口令,同時授予他們在數據庫 mysql_test的表customers上擁有SELECT和UPDATE的權限。

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

授予系統中已存在的wangwu可以在數據庫mysql_test中執行所有 數據庫操作的權限

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

授予系統中已存在的wangwu擁有創建用戶的權限

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

權限的轉移

授予當前系統中不存在的用戶 zhou 在數據庫mysql_test的表customers上 擁有SELECT和UPDATE的權限,并允許其可以將自身的這個權限授予給其他 用戶

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

使用REVOKE語句撤銷用戶權限

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

回收系統中已存在用戶zhou在數據庫mysql_test的表customers 上的SELECT權限

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

?

四、事務與并發控制

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

?

?以BEGIN TRANSACTION語句開始 以 COMMIT 語句或? ROLLBACK語句結束

事務的特征(ACID):

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

例題:依據事務的ACID特征,分析并編寫銀行數據庫系統中的轉賬事務T:從賬 戶A轉賬S金額資金到賬戶B

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

并發操作問題

  • 丟失更新 ? 事務T1,T2同時讀入同一數據并加以修改,T2的提交結果會破壞T1提交的結果
  • 不可重復讀 ? 事務T1讀取數據后,事務T2執行更新操作,使T1無法再現前一次讀取結果
  • 讀“臟”數據 ? 事務T1修改數據后撤銷,使得T2讀取的數據與數據庫中不一致

封鎖是最常用的并發控制技術 基本思想:需要時,事務通過向系統請 求對它所希望的數據對象加鎖,以確保 它不被非預期改變

鎖 :一個鎖實質上就是允許或阻止一個事務對一個數據對象的存取特權。

基本的封鎖類型:

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

封鎖的工作原理:

  • 1.若事務T對數據D加了X鎖,則所有別的事務對數據D的鎖請求都必須等 待直到事務T釋放鎖。
  • 2.若事務T對數據D加了S鎖,則別的事務還可對數據D請求S鎖,而對數據 D的X鎖請求必須等待直到事務T釋放鎖。
  • 3.事務執行數據庫操作時都要先請求相應的鎖,即對讀請求S鎖,對更新 請求X鎖。這個過程一般是由DBMS在執行操作時自動隱含地進行。
  • 4.事務一直占有獲得的鎖直到結束時釋放

封鎖的粒度

  • 我們通常以粒度來描述封鎖的數據單元的大小
  • DBMS可以決定不同粒度的鎖 粒度越細,并發性就越大,但軟件復雜性和系統開銷也就越大。

封鎖的級別又稱為一致性級別或隔離度

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

死鎖和活鎖

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

可串行性

  • 一組事務的一個調度就是它們的基本操作的一種排序。
  • 在數據庫系統中,可串行性就是并發執行的正確性準則,即當且當一組事務 的并發執行調度是可串行化的,才認為它們是正確的。

兩段封鎖法

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

五、備份與恢復?

數據丟失的途徑:

1.計算機硬件故障

2.計算機軟件故障

3.病毒

4.人為誤操作

5.自然災害

6.盜竊

數據庫備份與恢復的概念

  • 數據備份是指通過導出數據或者復制表文件的方式來制作數據庫的復本;
  • 數據庫恢復則是當數據庫出現故障或遭到破壞時,將備份的數據庫加載到 系統,從而使數據庫從錯誤狀態恢復到備份時的正確狀態。 數據庫的恢復是以備份為基礎的,它是與備份相對應的系統維護和管理操 作。

使用SELECT INTO…OUTFILE語句備份數據

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

file_name:指定數據備份文件的名稱

?

使用LOAD DATA…INFILE語句恢復數據

?

簡述恢復數據的方法?

備份數據庫mysql_test中表customers的全部數據到c盤的BACKUP目錄 下一個名為backupfile.txt的文件中,要求字段值如果是字符則用雙引號 標注,字段值之間用逗號隔開,每行以問號為結束標志。然后,將備份后 的數據導入到一個和customers表結構相同的空表customers_copy中。

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

?

轉載于:https://www.cnblogs.com/jalja/p/11614085.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248042.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.net core WebApi 使用Swagger生成API文檔

關于 Swagger Swagger能成為最受歡迎的REST APIs文檔生成工具之一&#xff0c;有以下幾個原因&#xff1a; Swagger 可以生成一個具有互動性的API控制臺&#xff0c;開發者可以用來快速學習和嘗試API。Swagger 可以生成客戶端SDK代碼用于各種不同的平臺上的實現。Swagger 文件可…

Git — 初體驗

準備工作 版本管理軟件 作用 記錄代碼的版本實現多人協作 分類 集中式&#xff0c;典型代表 SVN分布式&#xff0c;典型代表 Git 注冊遠程倉庫賬號 遠程倉庫相當于中央服務器我們需要在github上或碼云上注冊一個賬號&#xff0c;用于創建遠程倉庫使用注冊的時候&#xff0…

iOS CoreTelephony框架介紹與使用案列

昨晚看一篇文章時看到了私有API這個詞&#xff0c;貌似開發者對私有API的使用很反感于是果斷百度谷歌&#xff0c;以下是Stackoverflow中關于Private Frameworks的一個解釋&#xff1a; Private frameworks are frameworks which you are not allowed to use. They are not exp…

JS數組的迭代器方法

迭代器forEachevery一、迭代器方法 迭代器方法&#xff0c; 這些方法對數組中的每一個元素應用一個函數&#xff0c;可以返回一個值&#xff0c;一組值或一個新數組。 不生成新數組的迭代器方法 1.forEach() forEach()輸出 forEach輸出結果2.every() 該方法按接受一個返回值為布…

Git 筆記

三個區域 下面三個區域&#xff0c;是Git虛擬的區域&#xff0c;看不到&#xff0c;摸不著。 工作區 工作區&#xff0c;指的是使用Git管理后的文件&#xff0c;這些文件顯示在磁盤上&#xff0c;供我們使用或修改的區域。所以&#xff0c;粗略的說&#xff0c;項目文件夾就是…

C# webapi 上傳下載圖片

客戶端上傳文件 string url url "webUploadFile";Uri server new Uri(url);HttpClient httpClient new HttpClient();MultipartFormDataContent multipartFormDataContent new MultipartFormDataContent();StreamContent streamConent new StreamContent(new F…

OC-@dynamic 關鍵字

dynamic這個關鍵詞&#xff0c;通常是用不到的。 它與synthesize的區別在于&#xff1a; 使用synthesize編譯器會確實的產生getter和setter方法&#xff0c;而dynamic僅僅是告訴編譯器這兩個方法在運行期會有的&#xff0c;無需產生警告。 假設有這么個場景&#xff0c;B類&…

git -- 練習的筆記

gitgitee.com:my_exercises/my_exercises.githttps://gitee.com/my_exercises/my_exercises/invite_link?invite3ab56c724a0aed34ae2bd193ce87e741e67fe05ee029cc01b7993663152babc57d76203fdafbbb42e766b0d826817bc91.在任意位置右鍵打開 2.初始化設置 3.添加遠程倉庫地址 4.…

Swift傻傻分不清楚系列(十二) 屬性

本頁包含內容&#xff1a; 存儲屬性&#xff08;Stored Properties&#xff09;計算屬性&#xff08;Computed Properties&#xff09;屬性觀察器&#xff08;Property Observers&#xff09;全局變量和局部變量&#xff08;Global and Local Variables&#xff09;類型屬性&a…

GIT — 使用回顧

回顧Git的使用 記錄每次的變更 工作區 --> 暫存區 git add . / git add 文件 文件夾 .... 工作區 --> 暫存區/本地倉庫 前提條件&#xff1a;文件曾經被添加到暫存區或提交到倉庫git commit -a -m 提交說明 暫存區 --> 本地倉庫 git commit -m 提交說明 / git commi…

獲取兩個數百分比的值

1 /**2 * 獲取兩個數百分比的值3 * 4 * param num1 5 * param num26 * param retain 保留小數位數7 * return8 */9 public static String numberFormat(int num1, int num2, int retain) { 10 NumberFormat numberFormat …

iOS AVAudioPlayer和AVAudioPlayerDelegate-音頻播放處理中斷

學習總是在進行。 一、AVAudioPlayer如何處理中斷 AVAudioPlayer類提供了代理方法&#xff0c;用來處理當播放音頻文件時&#xff0c;發生來電、鬧鐘等事件。設置代理并遵守AVAudioPlayerDelegate協議,<span style"font-family: Arial, Helvetica, sans-serif;"&g…

Ajax — 大事件項目(第一天)

應用的前端技術 Ajax (重要) — jQuery方式接口請求Layui 框架使用HTML CSS JS 項目說明和演示 線上 DEMO 項目地址&#xff1a;http://www.liulongbin.top:8086/項目的 API 接口地址&#xff1a; https://www.showdoc.cc/escook?page_id3707158761215217 項目請求根路徑…

JS,JQ 格式化小數位數

在<script>中&#xff1a; $(function(){   var num$(".price").length;/*獲取應用了class"price"的標簽數量*/   for(var i0;i<num;i){     if($(".price")[i].innerText!"")       $(".price")[i]…

iOS開發實用技巧—Objective-C中的各種遍歷(迭代)方式

說明&#xff1a; 1&#xff09;該文簡短介紹在iOS開發中遍歷字典、數組和集合的幾種常見方式。 2&#xff09;該文對應的代碼可以在下面的地址獲得&#xff1a;https://github.com/HanGangAndHanMeimei/Code 一、使用for循環 要遍歷字典、數組或者是集合&#xff0c;for循環是…

windows系統作為客戶端時,linux中本地yum源掛載時,如何同時掛載DVD1和DVD2?

這里以CentOS6.5為例.他的鏡像有兩個DVD1和DVD2.DVD1中是系統和主要的安裝包,DVD2中是剩下的安裝包 當掛載時如果要同時掛載DVD1和DVD2.需要這樣做: 1)在虛擬機的設置中選擇連接 2)分別在mnt下創建cdrom和cdrom1文件夾 3)到dev下查看有軟連接 cdrom->sr0 cdrom1->sr1 這里…

Ajax — 大事件項目(第二天)

大事件-02 fix一個bug 原因&#xff1a; 開始做注冊的時候&#xff0c;頁面中只有一個 namepassword的input&#xff0c;所以 $(‘input[name“password”]’) 可以準確的找到元素后來做登錄的時候&#xff0c;頁面中多了一個namepassword的input&#xff0c;所以$(‘input[…

OpenCV自帶dnn的Example研究(3)— object_detection

這個博客系列&#xff0c;簡單來說&#xff0c;今天我們就是要研究https://docs.opencv.org/master/examples.html下的6個文件&#xff0c;看看在最新的OpenCV中&#xff0c;它們是如何發揮作用的。在配置使用的過程中&#xff0c;需要注意使用較高版本的VS避免編譯器兼容問題&…

Ajax — 大事件項目(第三天)

大事件-03 用戶信息 表單驗證 html中&#xff0c;直接使用layui提供的內置驗證規則 email <input type"text" name"email" required lay-verify"required|email" placeholder"請輸入郵箱" autocomplete"off" class&q…

iOS中監測來電方案

問題 最近在做一個有錄音功能的App&#xff0c;要求當用戶接到來電時&#xff0c;要停止錄音。該如何實現這個功能呢&#xff1f; 解決方案 我首先想到了AppDelegate里的applicationWillResignActive:方法&#xff0c;在該方法的注釋中就寫到到收到來電或短信時&#xff0c;系統…