数据库安全+触发器与存储过程
目录
- 数据库安全+触发器与存储过程
- 选择题
- 填空题
- 简答题
- 1、建立city值为上海、北京的顾客视图
- 题目
- 代码
- 题解
- 2、建立城市为上海的客户2016年的订单信息视图
- 题目
- 代码
- 题解
- 3、创建触发器,当更改商品价格(price列)时,记录价格
- 题目
- 代码
- 题解
- 4、SQL触发器:创建成绩表插入触发器
- 题目
- 代码
- 题解
- 5、SQL存储函数:查询学生的平均分**
- 题目
- 代码
- 题解
- 6、SQL存储过程:查询订单
- 题目
- 代码
- 题解
选择题
-
已有视图is_student,视图中包含信息系全体学生的基本信息。(已设置了限制更新)
执行如下语句:
UPDATE is_student
set sage=sage+1;
student表中数据如何变化? C
A. 全体学生年龄加1
B. 信息系学生年龄加1
C. 没有数据更新发生 -
将查询SC 表的权限授予用户U1,并允许该用户将此权限授予其他用户。实现此功能的SQL 语句是( D )。
A GRANT SELECT TO SC ON Ul WITH PUBIJIC
B GRANT SELECT ON SC TO U1 WITH PUBLIC
C GRANT SELECT TO SC ON Ul WITH GRANT OPTION
D GRANT SEIECT ON SC TO U1 WITH GRANT OPTION -
在强制存取控制机制中,当主体的许可证级别等于客体的密级时,主体可以对客体进行如下操作(C )。
A 读取
B 写入
C 读取,写入
D 不可操作在强制存取控制(MAC)机制中,主体对客体的访问操作是由主体的许可证级别和客体的密级共同决定的。当主体的许可证级别等于客体的密级时,主体可以对客体进行读取和写入操作
-
Student、SC、Course表中已有数据如下:
Student:
Sno Sname Sdept Ssex Sage 1234501 aaa CS 男 21 1234502 bbb CS 女 20 1234503 ccc IS 男 22 Course: Cno Cname Cpno Ccredit — ----- ---- ------- C01 Uuuu C08 1 C02 Vvvv C07 2 C03 Wwww C06 2 C10 Xxxx C15 3 C11 Yyyy C16 1 C12 Zzzz C20 4 SC: Sno Cno Grade ------------- — ----- 1234501 C01 80 1234501 C02 88 1234502 C01 90 1234503 C10 85 1234503 C11 91 若在SC表上建立外码: Foreign Key (Sno) References Student(Sno) ON Delete Cascade ON Update NO Action,
Foreign Key (Cno)References Course(Cno)ON Delete Cascade
ON Update NO Action,
则下面的操作不正确的是 D
A.在Student表中删除一个学生的基本信息:(学号1234501,姓名aaa,系别CS,性别男,年龄21),则SC表中第一行、第二行选课记录均被删除;
B.将Course表中的课程号C12修改为C13
C.删除SC表上第二行选课记录。
D.将Course表中的课程号C01修改为C15
在SC表上建立的外键约束指定了当Student表中的一行被删除时,SC表中与该行相关的行都将被删除(ON Delete Cascade)。因此,选项 A 中的操作是正确的,删除学号为1234501的学生会导致SC表中与该学生相关的选课记录也被删除。
对于选项 B 和 C,它们都只涉及到了Course表和SC表,而外键约束并未对它们之间的关系进行限制,因此这两个操作也都是正确的。
但是选项 D 中的操作将修改Course表中的主键值,而SC表中的Cno列是外键,它引用了Course表中的Cno列。如果将Course表中的主键值C01修改为C15,那么SC表中引用C01的选课记录将变得无效,因为它们引用了一个不存在的主键值。这将违反外键约束并导致操作失败。
【多选题】
-
Student、SC、Course表中已有数据如下:
Student:
Sno Sname Sdept Ssex Sage 1234501 aaa CS 男 21 1234502 bbb CS 女 20 1234503 ccc IS 男 22 Course Cno Cname Cpno Ccredit — ----- ---- ------- C01 Uuuu C08 1 C02 Vvvv C07 2 C03 Wwww C06 2 C10 Xxxx C15 3 C11 Yyyy C16 1 C12 Zzzz C20 4 SC Sno Cno Grade ----------- — ----- 1234501 C01 80 1234501 C02 88 1234502 C01 90 1234503 C10 85 1234503 C11 91 若在SC表上建立外码: Foreign Key (Sno) References Student(Sno) ON Delete NO Action ON Update NO Action,
Foreign Key (Cno)References Course(Cno)ON Delete NO Action
ON Update NO Action,
则下面能够正常执行的选项是 CD
A.删除Student表中学号为1234501的基本信息
B.将Course表中的课程号C01修改为C100
C.在SC表上删除所有课程号为C01的选课记录
D.在SC表上插入一行选课记录:学号为1234502,课程号为C02,成绩80
在SC表上建立的外键约束指定了当Student表中的一行被删除时,SC表中与该行相关的行不会被删除(ON Delete NO Action)。因此,选项 A 中的操作会违反外键约束而失败。
对于选项 B,这将修改Course表中的主键值,而SC表中的Cno列是外键,它引用了Course表中的Cno列。如果将Course表中的主键值C01修改为C100,那么SC表中引用C01的选课记录将变得无效,因为它们引用了一个不存在的主键值。这将违反外键约束并导致操作失败。
对于选项 C,这将在SC表中删除一些行,但是外键约束没有对这种删除行为进行限制,因此这个操作是可行的。
对于选项 D,这将在SC表中插入一行新的选课记录,它的Sno和Cno列都符合外键约束的要求,因此这个操作也是可行的。
-
下面 C 属于数据库完整性控制。
A.禁止未经授权的用户登录数据库
B.开启审计功能
C.不允许学生的考试成绩小于0分
D.将数据库中的数据备份
数据库完整性控制是指保护数据库中数据的正确性、一致性和有效性的一组控制措施。选项 C 涉及到对学生的考试成绩进行限制,以确保它们不会小于0分。这是一种完整性控制,以确保数据的有效性和正确性。
选项 A 属于数据库安全性控制,它控制谁可以访问数据库,以及访问权限的级别。
选项 B 属于数据库审计控制,用于跟踪和记录数据库中的操作,以便进行安全审计和故障排除。
选项 D 属于数据库备份和恢复控制,用于保护数据免受数据丢失和灾难性故障的影响。
-
视图中存放的是( C )。
A 查询语句
B 组成视图的表的内容
C 视图的定义
D 产生视图的表的定义
填空题
-
将school数据库student表上的select,insert权限授予给用户u1(可在任意地址登录)的语句是
grant select, insert on school.student to 'u1'@'%';
标点符号用英文状态,;结束语句)其中,grant 是授权的关键字,select、insert 是要授权的操作,school.student 是要授权的表,‘u1’@‘%’ 表示授权给用户名为 u1,可以在任意地址登录。注意,语句末尾需要使用分号 (😉 结束。
-
创建本地用户u1的语句是
CREATE USER 'u1'@'localhost' IDENTIFIED BY 'password';
。(标点符号为英文状态下字符,用;结束语句)其中,CREATE USER 是创建用户的关键字,‘u1’ 是用户的名称,‘localhost’ 表示该用户只能在本地登录,IDENTIFIED BY ‘password’ 表示该用户的密码是 password,可以根据需要修改为其他密码。注意,语句末尾需要使用分号 (😉 结束。
简答题
分析原因:向供应商表中插入数据
已知s(供应商表)结构:
列名 | 说明 | 数据类型 | 约束 |
SNO | 供应商号 | CHAR(6) | PRIMARY KEY |
SNAME | 供应商名 | VARCHAR(20) | NOT NULL |
STATUS | 供应商状态 | VARCHAR(50) | |
CITY | 所在城市 | VARCHAR(50) |
表中已有数据,供应商表s:
SNO | SNAME | STATUS | CITY |
S1 | 精益 | 20 | 天津 |
S2 | 盛锡 | 10 | 北京 |
继续往表中增加一条记录:四个字段的数据分别是S1,东方红,30,北京,会出现什么情况?为什么?
根据供应商表 s 的结构和已有数据,可以得知 SNO 是该表的主键,而且已有 S1 和 S2 这两个供应商号。如果继续往表中插入一条记录,其中 SNO 为 S1,那么会出现主键冲突的情况,因为已经存在一个 SNO 为 S1 的记录了。因此,插入操作会失败,数据库会返回一个错误提示,提示信息类似于“Duplicate entry ‘S1’ for key ‘PRIMARY’”。
这是因为主键是唯一的标识符,用于确保表中的每个记录都具有唯一的标识符。在插入数据时,如果主键值与表中现有记录的主键值相同,那么就会发生主键冲突,因为数据库无法确定要插入的记录是新记录还是旧记录。因此,在这种情况下,数据库会拒绝插入操作,并返回错误提示。
1、建立city值为上海、北京的顾客视图
题目
建立city值为上海、北京的顾客视图v_customer,包括顾客号、顾客名、联系人姓名、电话和地址。
其中客户表cutomer表结构为
订单表`order`表结构为
代码
CREATE VIEW v_customer
AS
SELECT customer_id,customer_name,contact_name,phone,address
FROM customer
WHERE city in("上海","北京");
题解
这是一个创建视图的SQL语句,它创建了名为v_customer的视图,该视图包含customer表中城市为"上海"或"北京"的客户的customer_id、customer_name、contact_name、phone和address列。
视图是虚拟的表,它是一个基于存储在数据库中的一个或多个表的查询结果集的命名查询,具有与基础表相同的列和数据类型。可以将视图看作是过滤、重组和聚合数据的一种方式,它可以简化复杂的查询,并提供一致的数据视图,同时还可以保护数据的安全性,隐藏敏感数据。
在这个例子中,创建的视图v_customer只包含城市为"上海"或"北京"的客户,这可以简化对这些客户的查询,并且可以防止未经授权的用户访问其他城市的客户数据。
2、建立城市为上海的客户2016年的订单信息视图
题目
建立城市为上海的客户2016年的订单信息视图v_order,包括顾客号、顾客名、该顾客2016年的订单数及订单总额。
其中客户表cutomer表结构为
订单表`order`表结构为
代码
CREATE VIEW v_order
AS
SELECT customer.customer_id,customer_name,count(order_id),sum(total_money)
from customer,`order`
where YEAR(order_date)=2016 and city="上海" and customer.customer_id = `order`.customer_id
GROUP BY customer.customer_id
题解
这是一个创建视图的SQL语句,它创建了名为v_order的视图,该视图包含2016年在上海城市下每个客户的订单数量和订单总金额的统计信息。
具体来说,该视图使用了customer表和order表,通过连接它们并使用WHERE子句和GROUP BY子句进行筛选和聚合操作,生成了以下结果:
- customer_id:客户ID,从customer表中获取。
- customer_name:客户名称,从customer表中获取。
- count(order_id):订单数量,统计order表中每个客户对应的订单数量。
- sum(total_money):订单总金额,统计order表中每个客户对应的订单金额总和。
这个视图可以方便地获取在2016年在上海城市下每个客户的订单数量和订单总金额,而不必编写复杂的SQL查询语句。视图还可以用于简化报表和分析工作,提高数据的可读性和可理解性。
3、创建触发器,当更改商品价格(price列)时,记录价格
题目
创建触发器,当更改商品product表的价格(price列)时,要将老的价格记录在一个名为price_log的表中。
相关表结构:
1、商品表:product
2、商品价格记录表:price_log
其中:id为自动增长列,update_time默认值为当前系统时间。
代码
delimiter $
CREATE TRIGGER BEFORE_update_price
BEFORE UPDATE
ON product
FOR EACH ROW
BEGIN
if(old.price<>new.price) THEN
INSERT price_log(product_id,price)
VALUES(old.product_id,old.price);
END IF;
END $
delimiter ;
题解
这是一个MySQL数据库中的触发器,它在product表中的price列更新之前被触发。当旧价格(old.price)与新价格(new.price)不同时,它会将旧的价格和对应的产品ID插入到名为price_log的表中,用于记录价格的变化历史。
具体来说,这个触发器的属性如下:
- 触发器名称:BEFORE_update_price。
- 触发事件:UPDATE,当product表中的任何行被更新时触发。
- 触发时机:BEFORE,更新操作执行之前触发。
- 触发表:product,即在product表上创建此触发器。
- 每行触发:FOR EACH ROW,即对于每一行更新操作,都会触发此触发器。
- 触发条件:IF语句,检查旧价格(old.price)与新价格(new.price)是否不同,如果不同则执行插入操作。
- 插入操作:将旧的价格(old.price)和对应的产品ID(old.product_id)插入到名为price_log的表中。
这个触发器可以用于跟踪产品价格的变化历史,以便进行后续的数据分析和报告。它可以自动记录价格的变化,减少手动操作的错误和漏洞,提高数据的准确性和可靠性。
4、SQL触发器:创建成绩表插入触发器
题目
#创建触发器,插入学生成绩时,限制必须在0-100之间。如果不在0-100之间,设置为0.
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
[注意:SQL表名请用小写]
代码
#创建触发器,插入学生成绩时,限制必须在0-100之间。如果不在0-100之间,设置为0.
delimiter $$
create trigger xiaohui
before insert on sc
for each row
begin
if new.grade<0 or new.grade>100
then set new.grade=0;
end if;
end $$
题解
这是一个MySQL数据库中的触发器,它在向sc表中插入数据时被触发。当插入的成绩不在0-100之间时,它将成绩设置为0。
具体来说,这个触发器的属性如下:
- 触发器名称:xiaohui。
- 触发事件:INSERT,当向sc表中插入数据时触发。
- 触发时机:BEFORE,插入操作执行之前触发。
- 触发表:sc,即在sc表上创建此触发器。
- 每行触发:FOR EACH ROW,即对于每一行插入操作,都会触发此触发器。
- 触发条件:IF语句,检查插入的成绩(new.grade)是否不在0-100之间,如果不在则执行设置为0的操作。
- 修改操作:将插入的成绩(new.grade)设置为0。
这个触发器可以用于限制学生成绩必须在0-100之间,保证数据的有效性和正确性。它可以自动检测并修正不合法的成绩数据,减少手动操作的错误和漏洞,提高数据的准确性和可靠性。
5、SQL存储函数:查询学生的平均分**
题目
#建立存储函数show_grade:根据课程号,返回该课程的平均成绩(保留两位小数)。
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
代码
delimiter $$
create function show_grade(ccno char(10))
returns decimal(10,2)
begin
return(select avg(grade) from sc
where cno=ccno);
end $$
题解
这是一个MySQL数据库中的函数,它返回特定课程的平均成绩。
具体来说,这个函数的属性如下:
- 函数名称:show_grade。
- 参数:ccno,一个char(10)类型的参数,用于指定要查询的课程号。
- 返回值类型:decimal(10,2),返回一个小数值,保留两位小数。
- 函数体:使用SELECT语句查询sc表中指定课程号(ccno)的成绩,计算平均成绩,并将结果返回。
这个函数可以用于在查询特定课程的平均成绩时使用,可以减少重复的SQL查询语句,并提高数据的可读性和可理解性。它可以作为其他查询语句的一部分使用,也可以直接调用以获取平均成绩数据。
6、SQL存储过程:查询订单
题目
#创建存储过程:total_order(IN orderid INT , OUT totals NUMERIC(9,2), OUT cid INT)
要求:根据输入的订单编号(order_id),返回订单总金额(total_money),顾客编号(customer_id)。
订单表:orders如下:
代码
#创建存储过程:total_order(IN orderid INT , OUT totals NUMERIC(9,2), OUT cid INT)
create procedure total_order(
in orderid INT,out totals NUMERIC(9,2),out cid INT)
select total_money,customer_id into totals,cid
from orders
where orderid = order_id;
题解
这是一个MySQL数据库中的存储过程,它接受一个输入参数orderid,查询orders表中符合条件的订单,并将订单的总金额和客户ID作为输出参数返回。
具体来说,这个存储过程的属性如下:
- 存储过程名称:total_order。
- 参数:orderid,一个INT类型的输入参数,表示要查询的订单ID。totals,一个NUMERIC(9,2)类型的输出参数,表示查询结果中的订单总金额。cid,一个INT类型的输出参数,表示查询结果中的客户ID。
- SELECT语句:使用SELECT语句查询orders表中符合条件的订单,将订单的总金额(total_money)和客户ID(customer_id)保存到totals和cid变量中。
- INTO语句:将查询结果存储到totals和cid变量中。
这个存储过程可以用于在查询指定订单的总金额和客户ID时使用,减少重复的SQL查询语句,并提高数据的可读性和可理解性。它可以作为其他查询语句的一部分使用,也可以直接调用以获取订单总金额和客户ID数据。