数据库系统头歌实验八 数据库完整性、安全设计

第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表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第1张图片

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表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第2张图片

N_S表由供应商的SNO、SNAME、STATUS、CITY及执行此操作的用户USER组成,现已构建该表,结构信息如下:

数据库系统头歌实验八 数据库完整性、安全设计_第3张图片

Mysql触发器语法:

数据库系统头歌实验八 数据库完整性、安全设计_第4张图片

创建触发器样例:删除tab1表记录后自动将tab2表中对应的记录删去。

数据库系统头歌实验八 数据库完整性、安全设计_第5张图片

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表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第6张图片

Mysql触发器语法:

数据库系统头歌实验八 数据库完整性、安全设计_第7张图片

创建触发器样例:删除tab1表记录后自动将tab2表中对应的记录删去。

数据库系统头歌实验八 数据库完整性、安全设计_第8张图片

注意:

数据库系统头歌实验八 数据库完整性、安全设计_第9张图片

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表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第10张图片

PJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTY由SPJ表中的工程项目代码(JNO)、零件代码(PNO)、供应数量(QTY),根据JNO、PNO汇总得到。 SPJ_SUMQTY表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第11张图片

Mysql触发器语法:

数据库系统头歌实验八 数据库完整性、安全设计_第12张图片

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表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第13张图片

SPJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTY由SPJ表中的工程项目代码(JNO)、零件代码(PNO)、供应数量(QTY)根据JNO、PNO汇总得到。 SPJ_SUMQTY表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第14张图片

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表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第15张图片

SPJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTY由SPJ表中的工程项目代码(JNO)、零件代码(PNO)、供应数量(QTY)根据JNO、PNO汇总得到。 SPJ_SUMQTY表如下图:

数据库系统头歌实验八 数据库完整性、安全设计_第16张图片

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;

你可能感兴趣的:(数据库实验,数据库)