数据库系统头歌实验八 数据库完整性、安全设计
SPJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTY由SPJ表中的工程项目代码(JNO)、零件代码(PNO)、供应数量(QTY)根据JNO、PNO汇总得到。SPJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTY由SPJ表中的工程项目代
第1关:执行 CREATE USER 创建以2022100904为用户名的用户,同时设置其密码为root1234
#请在此处添加实现代码
########## Begin ##########
CREATE USER '2022100904'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root1234';
########## End ##########
#以下代码禁止删除
SELECT mysql.user.Host, mysql.user.User FROM mysql.user WHERE USER = '2022100904';
第2关:给予创建的用户2022100904在mydata数据库中授予"J" 表 SELECT 权限(注意创建权限时的用户名为'用户名'@'localhost'),不允许转授此权限给其它用户。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
grant select on mydata.J to '2022100904'@'localhost';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR '2022100904'@'localhost';
第3关:给予创建的用户2022100904、2022100908在mydata数据库中授予"J" 表 ALL PRIVILEGES权限(注意创建权限时的用户名为'用户名'@'localhost'),不允许转授此权限给其它用户。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
grant all on mydata.J to '2022100904'@'localhost';
grant all on mydata.J to '2022100908'@'localhost';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR '2022100904'@'localhost';
SHOW GRANTS FOR '2022100908'@'localhost';
第4关:给予创建的用户2022100904在mydata数据库中授予“J”表的UPDATE和INSERT权限,允许转授此权限给其它用户。
工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:
USE mydata;
#请在此处添加实现代码
########## Begin ##########
grant update,insert on mydata.J to '2022100904'@'localhost' with grant option;
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR '2022100904'@'localhost';
第5关:回收用户2022100904在mydata数据库中授予的 "J" 表 SELECT权限(回收权限时的用户名为'用户名'@'localhost')。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
revoke select on mydata.J from '2022100904'@'localhost';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR '2022100904'@'localhost';
第6关:回收账号2022100904、2022100908在mydata数据库的中授予 的J表ALL PRIVILEGES权限(注意回收权限时的用户名为'用户名'@'localhost')
USE mydata;
#请在此处添加实现代码
########## Begin ##########
revoke all on mydata.J from '2022100904'@'localhost';
revoke all on mydata.J from '2022100908'@'localhost';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR '2022100904'@'localhost';
SHOW GRANTS FOR '2022100908'@'localhost';
第7关:回收用户2022100904在mydata数据中授予的“J”表UPDATE和INSERT的权限。(注意回收权限时的用户名为'用户名'@'localhost')
USE mydata;
#请在此处添加实现代码
########## Begin ##########
revoke update,insert on mydata.J from '2022100904'@'localhost';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR '2022100904'@'localhost';
第8关:创建角色 'R1'
#请在此处添加实现代码
########## Begin ##########
create role 'R1';
########## End ##########
#以下代码禁止删除
SELECT mysql.user.Host, mysql.user.User FROM mysql.user WHERE USER = 'R1';
第9关:给予创建的角色R1在mydata数据库中授予"J" 表 的SELECT 、UPDATE、INSERT权限。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
grant select,update,insert on mydata.J to 'R1';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR 'R1';
第10关:给予创建的用户2022100904授予角色R1权限。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
grant 'R1' to '2022100904'@'localhost';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR '2022100904'@'localhost';
第11关:给予已授权限的角色R1在mydata数据库中再次授予"J" 表 的DELETE权限。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
grant delete on mydata.J to 'R1';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR 'R1';
第12关:回收角色R1 对 J表的 INSERT 权限。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
revoke insert on mydata.J from 'R1';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR 'R1';
第13关:通过角色R1回收用户2022100904的被授予J表的SELECT 、UPDATE、INSERT权限。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
revoke 'R1' from '2022100904'@'localhost';
########## End ##########
#以下代码禁止删除
SHOW GRANTS FOR '2022100904'@'localhost';
第14关:编写一个名为INSERT_S的触发器,在S表执行 INSERT 语句后被激发,此触发器将新供应商的SNO、SNAME、STATUS、CITY及执行此操作的用户(USER)插入N_S表,N_S表比S表增添操作用户一列。
供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成. S表如下图:
N_S表由供应商的SNO、SNAME、STATUS、CITY及执行此操作的用户USER组成,现已构建该表,结构信息如下:
Mysql触发器语法:
创建触发器样例:删除tab1表记录后自动将tab2表中对应的记录删去。
USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE TRIGGER INSERT_S
AFTER INSERT ON S
FOR EACH ROW
Begin
INSERT INTO N_S(SNO,SNAME,STATUS,CITY,USER) VALUES
('S6','深技大','20','深圳','root@localhost');
END$
DELIMITER ;
########## End ##########
#以下代码禁止删除
#将记录插入S表
INSERT INTO S VALUES ('S6', '深技大', '20', '深圳');
#查看N_S表
SELECT * FROM N_S;
第15关:编写一个名为UPDATE_S的触发器,检查S表的STATUS,只允许0-100之间,超过100后,改为100。
供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成. S表如下图:
Mysql触发器语法:
创建触发器样例:删除tab1表记录后自动将tab2表中对应的记录删去。
注意:
USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE TRIGGER UPDATE_S
BEFORE UPDATE ON S
FOR EACH ROW
BEGIN
IF(NEW.STATUS <0) OR (NEW.STATUS>100)
THEN SET NEW.STATUS=100;
END IF;
END$
DELIMITER ;
########## End ##########
#以下代码禁止删除
#更新S表
UPDATE S SET S.STATUS = 300 WHERE S.CITY = '天津';
#查看S表
SELECT * FROM S;
第16关:编写一个名为UPDATE_SPJ的触发器,当SPJ表中有更新某条记录时,自动更新表SPJ_SUMQTY表。
供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:
PJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTY由SPJ表中的工程项目代码(JNO)、零件代码(PNO)、供应数量(QTY),根据JNO、PNO汇总得到。 SPJ_SUMQTY表如下图:
Mysql触发器语法:
USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE TRIGGER UPDATE_SPJ
AFTER UPDATE ON SPJ
FOR EACH ROW
BEGIN
UPDATE SPJ_SUMQTY SET SUMQTY = SUMQTY + NEW.QTY - OLD.QTY
WHERE PNO = NEW.PNO AND JNO = NEW.JNO;
END $
DELIMITER ;
########## End ##########
#以下代码禁止删除
#更新SPJ表
UPDATE SPJ SET SPJ.QTY = SPJ.QTY + 200 WHERE SPJ.JNO = 'J5';
#查看SPJ_SUMQTY表
SELECT * FROM SPJ_SUMQTY;
第17关:编写一个名为DELETE_SPJ的触发器,当SPJ表中有删除某条记录时,自动更新表SPJ_SUMQTY表。
供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:
SPJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTY由SPJ表中的工程项目代码(JNO)、零件代码(PNO)、供应数量(QTY)根据JNO、PNO汇总得到。 SPJ_SUMQTY表如下图:
USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $$
CREATE TRIGGER DELETE_SPJ
AFTER DELETE ON SPJ
FOR EACH ROW
BEGIN
UPDATE SPJ_SUMQTY SET SUMQTY = SUMQTY - OLD.QTY
WHERE SPJ_SUMQTY.PNO = OLD.PNO AND SPJ_SUMQTY.JNO = OLD.JNO;
DELETE FROM SPJ_SUMQTY WHERE SPJ_SUMQTY.SUMQTY <=0;
END $$
DELIMITER ;
########## End ##########
#以下代码禁止删除
#删除SPJ表的某条记录
DELETE FROM SPJ WHERE SPJ.SNO = 'S2' AND SPJ.PNO = 'P3' AND SPJ.JNO = 'J5';
DELETE FROM SPJ WHERE SPJ.SNO = 'S2' AND SPJ.PNO = 'P3' AND SPJ.JNO = 'J1';
#查看SPJ_SUMQTY表
SELECT * FROM SPJ_SUMQTY;
第18关:编写一个名为INSERT_SPJ的触发器,当SPJ表中有插入某条记录时,自动更新表SPJ_SUMQTY表。
供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:
SPJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTY由SPJ表中的工程项目代码(JNO)、零件代码(PNO)、供应数量(QTY)根据JNO、PNO汇总得到。 SPJ_SUMQTY表如下图:
USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE TRIGGER INSERT_SPJ
AFTER INSERT ON SPJ
FOR EACH ROW
BEGIN
UPDATE SPJ_SUMQTY SET SUMQTY = SUMQTY + NEW.QTY
WHERE SPJ_SUMQTY.PNO = NEW.PNO AND SPJ_SUMQTY.JNO =NEW.JNO;
IF NEW.JNO NOT IN (SELECT JNO FROM SPJ_SUMQTY)
OR NEW.PNO NOT IN (SELECT PNO FROM SPJ_SUMQTY)
THEN INSERT INTO SPJ_SUMQTY VALUES (NEW.JNO,NEW.PNO,NEW.QTY);
END IF;
END $
DELIMITER ;
########## End ##########
#以下代码禁止删除
#将记录插入SPJ表
INSERT INTO SPJ VALUES ('S6', 'P1', 'J6', 200);
INSERT INTO SPJ VALUES ('S6', 'P3', 'J5', 300);
#查看SPJ_SUMQTY表
SELECT * FROM SPJ_SUMQTY;
更多推荐
所有评论(0)