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) );
-
向員工表中插入記錄,驗證主碼不能為空且不能重復。
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); #主碼不能重復
-
向員工表中插入記錄,驗證工種名稱不能取空值。
INSERT employees VALUES (1002,'李四',20,'',50000,01);
-
向員工表中插入記錄,不用給工資賦值,查看是否有默認值。
INSERT employees (employee_id,employee_name,age,job_title,department_id) VALUES (1002,'李四',20,'經理',01); SELECT * FROM employees WHERE employee_id=1002;
-
向員工表中插入記錄,驗證外碼的值必須是其所參照的主碼的值。
INSERT employees VALUES (1003,'王五',21,'技工',6000,02);
-
向部門表中插入記錄,驗證電話號碼是否能取重復值。
INSERT departments VALUES (02,'后勤部','小明','北京','010110');#電話號碼不可取重復值
-
向兩張表中分別插入一條記錄,如下,刪除部門表中新插入的記錄,能否正常刪除?若不能,該怎么處理?(違約處理,可級聯置空或刪除;可先刪外鍵定義,再重新添加外鍵定義)
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;
-
向兩張表中分別插入一條記錄,如下,更新部門表中新插入的記錄,將部門號更改為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
二、測試安全性
-
添加兩個新用戶,user1的密碼為1234,只能通過本地訪問,user2的密碼為adcd,可以任意電腦進行鏈接訪問。點擊"創建新連接 Ctrl+M"打開登錄界面,分別以user1和user2身份登錄MySQL服務器,試運行CREATE DATABASE test,能否成功?
CREATE USER 'user1'@'localhost' IDENTIFIED BY '1234', 'user2' IDENTIFIED BY 'adcd';
無法成功
-
使用GRANT語句創建一個新用戶user3,密碼為1234,可以任意電腦進行鏈接訪問,並授予庫MyEmployees所有數據表的SELECT和UPDATE權限,驗證該用戶是否可以查詢、更新、刪除?
CREATE USER 'user3'@'%' IDENTIFIED BY '1234'; GRANT SELECT,UPDATE ON MyEmployees.* TO 'user3'@'%';
-
以使用root身份將user1的密碼修改為1111,並驗證。
SET PASSWORD FOR 'user1'@'localhost' ='1111';
-
以使用user2身份將user1的密碼修改為1234,能否修改,為什么?
無法修改,因為無權限。
-
將查詢員工表信息,修改員工表的工資授權給user1。
GRANT SELECT,UPDATE(salary) ON MyEmployees.employees TO 'user1';
-
使用GRANT語句創建一個新用戶user4,可以任意電腦進行鏈接訪問,密碼為"1234"。用戶user4對庫MyEmployees中所有的數據有查詢、插入權限,並授予GRANT權限。
CREATE USER 'user4'@'%' IDENTIFIED BY '1234'; GRANT SELECT,INSERT ON MyEmployees.* TO 'user4'@'%' WITH GRANT OPTION;
-
以user4身份登錄,將對部門表的查詢權限授予user2,驗證是否能將刪除權限也授予給user2。
GRANT SELECT ON MyEmployees.* TO 'user2'@'%' WITH GRANT OPTION;
-
回收user2的所有權限后再刪除user2的賬戶。
REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'user2'; DROP USER 'user2';
實 驗 心 得:
通過本次實驗,我更加熟悉了MySQL的完整性約束技術,了解了MySQL的違反完整性處理措施,了解了登錄賬戶的管理理念與具體方法,了解數據庫用戶的管理的要則,了解用戶權限管理的內涵與方法。收獲頗豐。