數據庫原理及應用.實驗5.數據庫的完整性和安全性


2022/11/3 修復 employees員工表、departments 部門表 的 Markdown表格顯示

實驗報告

  課程名稱:數據庫原理及應用
  實驗項目名稱:數據庫的完整性和安全性
  實驗時間:2021年5月24日


實 驗 目 的:

  1. 熟悉MySQL的完整性約束技術。
  2. 了解MySQL的違反完整性處理措施。
  3. 了解登錄賬戶的管理理念與具體方法。
  4. 了解數據庫用戶的管理的要則。
  5. 了解用戶權限管理的內涵與方法。

實 驗 環 境:

  MySQL、SQLyog

實 驗 內 容 及 過 程:

一、測試完整性

  • 創建庫MyEmployees並創建以下兩個關系模式,使用SQL對數據進行完整性控制, 並證實,當操作違反了完整性 約束條件時,系統是如何處理的。

    員工(員工編號,姓名,年齡,工種名稱,工資,部門號);

    部門(部門編號,名稱,經理名,地址,電話號碼);

    employees 員工表

    字段名 數據類型 約束 含義
    employee_id int primary key 員工編號
    employee_name varchar(20) 姓名
    age smallint 年齡
    job_title varchar(20) not null 工種名稱
    salary double(10,2) default 2000 工資
    department_id int foreign key 部門編號

    departments 部門表

    字段名 數據類型 約束 含義
    department_id int primary key 部門編號
    department_name varchar(20) 部門名稱
    manager_name varchar(20) 經理名
    location varchar(30) default '福建' 地址
    phone char(11) not null unique 電話號碼
    DROP DATABASE MyEmployees;
    CREATE DATABASE IF NOT EXISTS MyEmployees;
    USE MyEmployees;
    CREATE TABLE departments(
    	department_id INT PRIMARY KEY,
    	department_name VARCHAR(20),
    	manager_name VARCHAR(20),
    	location VARCHAR(30) DEFAULT '福建',
    	phone CHAR(11) NOT NULL UNIQUE
    );
    CREATE TABLE employees (
    	employee_id INT PRIMARY KEY,
    	employee_name VARCHAR(20),
    	age SMALLINT,
    	job_title VARCHAR(20) NOT NULL,
    	salary DOUBLE(10,2) DEFAULT 2000,
    	department_id INT,
    	FOREIGN KEY(department_id) REFERENCES departments(department_id)
    );
    
  1. 向員工表中插入記錄,驗證主碼不能為空且不能重復。

    INSERT departments
    VALUES (01,'信息部','李四','北京','010110');
    
    INSERT employees
    VALUES (1001,'張三',20,'技工',5000,01); #正常添加
    
    INSERT employees
    VALUES ('','張三',20,'技工',5000,01); #主碼不能為空
    
    INSERT employees
    VALUES (1001,'張三',20,'技工',5000,01); #主碼不能重復
    
  2. 向員工表中插入記錄,驗證工種名稱不能取空值。

    INSERT employees
    VALUES (1002,'李四',20,'',50000,01);
    
  3. 向員工表中插入記錄,不用給工資賦值,查看是否有默認值。

    INSERT employees (employee_id,employee_name,age,job_title,department_id)
    VALUES (1002,'李四',20,'經理',01);
    
    SELECT * FROM employees
    WHERE employee_id=1002;
    
  4. 向員工表中插入記錄,驗證外碼的值必須是其所參照的主碼的值。

    INSERT employees
    VALUES (1003,'王五',21,'技工',6000,02);
    
  5. 向部門表中插入記錄,驗證電話號碼是否能取重復值。

    INSERT departments
    VALUES (02,'后勤部','小明','北京','010110');#電話號碼不可取重復值
    
  6. 向兩張表中分別插入一條記錄,如下,刪除部門表中新插入的記錄,能否正常刪除?若不能,該怎么處理?(違約處理,可級聯置空或刪除;可先刪外鍵定義,再重新添加外鍵定義)

    INSERT INTO departments
    VALUES(10, '研發部', '張時', '上海', 1361111111);
    INSERT INTO employees
    VALUES(100, '李麗莎', 30, '軟件工程師', 10000, 10);
    
    DELETE FROM departments
    WHERE department_id=10; #傳統辦法無法正常刪除
    
    #SHOW CREATE TABLE employees
    #先刪除表級約束
    ALTER TABLE employees DROP FOREIGN KEY employees_ibfk_1;
    #再添加級聯刪除
    ALTER TABLE employees
    ADD FOREIGN KEY(department_id) REFERENCES departments(department_id)
    ON DELETE CASCADE;
    #即可刪除數據
    DELETE FROM departments
    WHERE department_id=10;
    
  7. 向兩張表中分別插入一條記錄,如下,更新部門表中新插入的記錄,將部門號更改為99,能否正常更改?若不能,該怎么處理?(違約處理,可級聯置空或更新;可先刪外鍵定義,再重新添加外鍵定義)

    INSERT INTO departments
    VALUES(30, '人事部', '張琳', '福建', 1361111112);
    INSERT INTO employees
    VALUES(110, '李莎', 30, '會計', 6000, 30);
    
    ALTER TABLE employees DROP FOREIGN KEY employees_ibfk_1;
    ALTER TABLE employees
    ADD FOREIGN KEY(department_id) REFERENCES departments(department_id)
    ON UPDATE CASCADE;
    UPDATE departments
    SET department_id=99
    WHERE department_id=30
    

二、測試安全性

  1. 添加兩個新用戶,user1的密碼為1234,只能通過本地訪問,user2的密碼為adcd,可以任意電腦進行鏈接訪問。點擊"創建新連接 Ctrl+M"打開登錄界面,分別以user1和user2身份登錄MySQL服務器,試運行CREATE DATABASE test,能否成功?

    CREATE USER 
    'user1'@'localhost' IDENTIFIED BY '1234',
    'user2' IDENTIFIED BY 'adcd';
    

    無法成功

  2. 使用GRANT語句創建一個新用戶user3,密碼為1234,可以任意電腦進行鏈接訪問,並授予庫MyEmployees所有數據表的SELECT和UPDATE權限,驗證該用戶是否可以查詢、更新、刪除?

    CREATE USER 'user3'@'%' IDENTIFIED BY '1234';
    GRANT SELECT,UPDATE 
    ON MyEmployees.* 
    TO 'user3'@'%';
    
  3. 以使用root身份將user1的密碼修改為1111,並驗證。

    SET PASSWORD FOR 'user1'@'localhost' ='1111';
    
  4. 以使用user2身份將user1的密碼修改為1234,能否修改,為什么?

    無法修改,因為無權限。

  5. 將查詢員工表信息,修改員工表的工資授權給user1。

    GRANT SELECT,UPDATE(salary)
    ON MyEmployees.employees 
    TO 'user1';
    
    
  6. 使用GRANT語句創建一個新用戶user4,可以任意電腦進行鏈接訪問,密碼為"1234"。用戶user4對庫MyEmployees中所有的數據有查詢、插入權限,並授予GRANT權限。

    CREATE USER 'user4'@'%' IDENTIFIED BY '1234';
    GRANT SELECT,INSERT 
    ON MyEmployees.* 
    TO 'user4'@'%'
    WITH GRANT OPTION;
    
  7. 以user4身份登錄,將對部門表的查詢權限授予user2,驗證是否能將刪除權限也授予給user2。

    GRANT SELECT
    ON MyEmployees.* 
    TO 'user2'@'%'
    WITH GRANT OPTION;
    
  8. 回收user2的所有權限后再刪除user2的賬戶。

    REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'user2';
    DROP USER 'user2';
    

實 驗 心 得:

  通過本次實驗,我更加熟悉了MySQL的完整性約束技術,了解了MySQL的違反完整性處理措施,了解了登錄賬戶的管理理念與具體方法,了解數據庫用戶的管理的要則,了解用戶權限管理的內涵與方法。收獲頗豐。

附 錄:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM