一、分析说明题
在数据库系统应用为公众提供信息服务过程中,为什么要求对运营者和维护管理人员实施严格的法规与职业道德约束?从技术层面如何保护用户个人隐私和机构商业机密?
在数据库系统应用为公众提供信息服务过程中,要求对运营者和维护管理人员实施严格的法规与职业道德约束的原因如下:
(1)保护用户权益:作为信息服务的提供者,运营者和维护管理人员需要遵守相关的法规和职业道德规范,确保用户的个人隐私得到保护,并且不会被滥用或泄露。
(2)保证公平公正:运营者和维护管理人员应该遵守公平公正的原则,不得利用自身职务和权限谋取私利,同时应该确保信息服务的公正性和客观性。
(3)提高服务质量:运营者和维护管理人员需要遵守职业道德规范,提高服务质量,维护用户的利益和权益,从而提高公众对信息服务的信任度和满意度。
从技术层面来说,保护用户个人隐私和机构商业机密需要采取以下措施:
(1)访问控制:通过访问控制的方式限制不同角色的人员对数据库系统中的数据的访问权限,确保只有授权的人员才能访问相关数据。
(2)数据加密:对重要的个人隐私和机构商业机密数据进行加密,确保即使数据被窃取或泄露,也无法被未经授权的人员解密。
(3)数据备份和恢复:定期对数据库系统中的数据进行备份,以防数据丢失或损坏,同时建立完善的数据恢复机制,保障数据的完整性和可用性。
(4)安全审计:对数据库系统中的操作进行记录和审计,确保不良行为和违规操作得到及时发现和处理,同时也能够为安全事件的调查提供有力的证据。
二、数据库后端编程动手实践题
在一个成绩管理系统数据库GradeDB中,定义如下关系表:
STUDENT(SID,SName,Age,Sex)
GRADE(SID,CID,Score, Note)
COURSE(CID,CName,Teacher)
(1)编写SQL程序创建数据库及其关系表,并插入20个学生的2门课程(“数据库原理及应用”、“数据结构与算法”)成绩数据;
(2)编写触发器程序实现GRADE表数据修改在日志表(GradeLOG)记录相关操作数据,如操作用户、学号、课程号、修改时间、修改前成绩、修改后成绩。
(3)编写存储过程程序实现统计各课程不及格学生人数,并在屏幕输出;
(1)编写SQL程序创建数据库及其关系表,并插入20个学生的2门课程(“数据库原理及应用”、“数据结构与算法”)成绩数据;
创建数据库,创建结果如下图1-1所示。
图1-1 创建gradeDB数据库
创建student、course、grade这三个表,创建结果如图1-2所示。
图1-2 创建表对象
插入20个学生的数据库原理及应用和数据结构与算法这两门课程成绩数据,如图1-3所示。
图1-3 插入成绩数据
查询grade表,检查是否插入数据成功,如下图1-4所示。
图1-4 检查插入数据是否成功
- 编写触发器程序实现GRADE表数据修改在日志表(record)记录相关操作数据,如操作用户、学号、课程号、修改时间、修改前成绩、修改后成绩。
建立record表,用于记录修改成绩信息,属性包括操作用户、学号、课程号、修改时间、修改前成绩、修改后成绩,如图2-1所示。
图2-1 创建record表
创建触发器函数tri_func(),如图2-2所示。
图2-2 创建触发器函数
创建触发器如图2-3所示。
图2-3 创建触发器
- 编写存储过程程序实现统计各课程不及格学生人数,并在屏幕输出;
编写存储过程程序cnt_num(),如下图3-1所示。
图3-1 编写存储过程程序
调用该程序,输出结果如图3-2所示。
图3-2 调用存储过程
三、挑战性问题解决
针对成绩管理系统数据库应用访问,编写Java Web应用程序实现成绩查询功能,即输入课程名,查询该班学生成绩表页面输出。(建议使用MyBatis框架实现数据访问)。
针对成绩管理系统数据库应用访问,使用JDBC技术编写Java Web应用程序实现成绩查询功能,即输入课程名,查询该班学生成绩表页面输出。具体步骤如下:
(1)使用Class.forName("org.postgresql.Driver")加载PostgreSQL驱动程序。
(2)使用DriverManager.getConnection(String url, String user, String pwd) 建立与数据库的连接,返回表示连接的Connection对象,url指明数据库服务器名、端口号及数据库名, user 指明具有连接权限的用户名,pwd是指明用户user的口令;
(3)使用Connection.createStatement()创建Statement对象,静态SQL语句查询;
(4)从键盘接收用户要查询的课程名,使用tatement.executeQuery(String sql)执行SQL中的select语句,返回一个表示查询结果的ResultSet对象,并用变量res接收;
(5)使用next()访问数据库查询返回结果并打印学生姓名、学号、成绩、备注;
(6)使用close()关闭连接。
编写完成的代码如下所示:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class Querygrade { //输入课程名,查询该班学生成绩表页面输出
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Connection conn = null;
Statement stmt = null;
String url = "jdbc:postgresql://localhost:5432/gradedb";
String username = "postgres";
String password = "123456";
try {
Class.forName("org.postgresql.Driver");
conn =DriverManager.getConnection(url,username, password);
System.out.println("数据库连接成功!");
stmt = (Statement)conn.createStatement();
System.out.print("请输入要查询的课程名称:");
String cname = scan.next(); //输入课程名
String sql = "select s.sname,s.sid,g.score,g.note\r\n"
+ "from student as s join grade as g on s.sid = g.sid\r\n"
+ " join course as c on g.cid = c.cid\r\n"
+ "where c.cname = '" + cname + "'";
ResultSet res = stmt.executeQuery(sql);
System.out.println("查询结果为:");
while(res.next()) {
System.out.println(res.getString("sname") + " " + res.getString("sid") +
" " + res.getString("score") + " " + res.getString("note"));
}
stmt.close();
conn.close();
} catch (Exception e) {
System.err.println(e.getClass().getName() + ":" + e.getMessage());
}
}
}