设计openGauss数据库存储过程和触发器实现数据库完整性
1.实训内容与任务
某软件公司项目组正在为一高校开发教务选课系统。作为该项目组数据库设计人员,你通过前期调研,完成了数据库的需求分析,设计出了系统中的两个核心业务排课和选课的数据流图,并进行了数据库概念结构设计和逻辑结构设计,完成了数据库系统的E-R模型、关系模式和基本表设计。这些基本表包括专业分类表、专业表、院部表、教师表、班级表、学生表、角色表、用户表、日志表、课程表、学期表、校区表、教室表、排课表、排课明细表、选课表等。已知数据库选用开源的关系型数据库openGauss。接下来,你需要完成以下任务:
(1)编写openGauss SQL代码创建选课数据库;
(2)编写openGauss SQL代码创建基本表;
(3)编写openGauss SQL代码向基本表中添加测试数据;
(4)分析选课业务的数据流图,设计存储过程和触发器实现向选课表和日志表中插入记录,以保证数据库的完整性。
2.实训过程及要求
参训学生需要提前学习关系数据库理论、基本表、存储过程、触发器、数据库设计方法、openGauss SQL编程的基础知识等内容。
在实训过程中完成:
(1)数据库实训项目要解决的问题界定;
(2)实验原理或思路方法或解决方案的说明;
(3)在已搭建好的实训环境(Windows操作系统下虚拟化环境下安装openEuler操作系统,并安装openGauss数据库管理系统和Data Studio)编写openGauss SQL 程序代码并执行;
(4)实验结果分析;
(5)实验报告撰写。
3.相关知识及背景
该实训项目用到的主要知识包括:
- 关系数据库与关系数据理论;
- 数据库完整性;
- openGauss数据库设计方法;
- openGauss SQL语法基础;
- openGauss数据库核心对象存储过程、函数和触发器管理。
4.教学目的
(1)理解数据完整性;
(2)掌握openGauss数据库存储过程的定义和使用;
(3)掌握openGauss数据库触发器的定义和使用;
(4)通过实训项目培养学生程序设计能力;
(5)通过实训项目中数据库基本表的分析培养学生的数据思维;
(6)通过实训项目中SQL程序设计分析培养学生的算法思维。
5.实训教学与指导
指导教师实训前知识讲解:
通过实例重点讲解openGauss SQL中定义和调用存储过程、触发器的基本语法和应用。
知识点1:存储过程
存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序调用执行,而且允许用户声明变量、有条件执行以及其它编程功能。使用存储过程的有好处是:
1存储过程在数据库服务器端运行,执行速度快。
2存储过程执行一次后驻留在数据库服务器的高速缓存中,再次执行存储过程时,只需从高速缓存中调用已编译好的代码即可,从而提高了系统性能。
3确保数据库安全。使用存储过程,可以在禁止用户直接访问数据库某些基本表的情况下,授权执行访问这些基本表的存储过程。这样对于没有获得访问数据表授权的用户将只能通过存储过程访问这些基本表,从而确保了这些标的访问安全。
4自动完成预先设置的任务。存储过程可以设置为系统启动时自动执行,而不必在系统启动后再进行操作,方便用户使用。
知识点2:触发器
触发器(Trigger)又叫做事件-条件-动作规则,是用户定义在关系表上的一类由事件驱动的特殊过程(Procedure)。当特定的系统事件发生时,对规则的条件进行检查。如果条件成立则执行规则中的动作,否则不执行该动作。规则中的动作体可以很复杂,通常是一段SQL存储过程。触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力。触发器保存在数据库服务器中。触发器主要用于:
1对表的修改进行验证;
2数据库自动维护;
3严格控制对数据库对象的操作。
触发器类似于存储过程,但它不能被显式调用,而是由数据库服务器维护,在特定事件发生时由数据库调用。openGauss提供了在DML操作和DDL操作之前和之后的触发器等,这些触发器的应用丰富了DBA的执行、审计、安全或完整性关联的管理任务。
知识点3:存储过程和触发器的应用
(1)存储过程的定义、修改、调用和删除
1)定义或修改存储过程
语法格式:
CREATE [ OR REPLACE ] PROCEDURE procedure_name
[ ( {[ argmode ] [ argname ] argtype [ { DEFAULT | := | = } expression ]}[,...]) ]
[
{ IMMUTABLE | STABLE | VOLATILE }
| { SHIPPABLE | NOT SHIPPABLE }
| {PACKAGE}
| [ NOT ] LEAKPROOF
| { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { [ TO | = ] value | FROM CURRENT }
][ ... ]
{ IS | AS }
plsql_body
/
注意事项 :
如果创建存储过程时参数或返回值带有精度,不进行精度检测。创建存储过程时,存储过程定义中对表对象的操作建议都显示指定模式,否则可能会导致存储过程执行异常。在创建存储过程时,存储过程内部通过SET语句设置current_schema和search_path无效。执行完函数search_path和current_schema与执行函数前的search_path和current_schema保持一致。如果存储过程参数中带有出参,SELECT调用存储过程必须缺省出参,CALL调用存储过程调用非重载函数时必须指定出参,对于重载的package函数,out参数可以缺省,具体信息参见CALL的示例。存储过程指定package属性时支持重载。在创建procedure时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。
[实例1]创建排课存储过程
2)调用存储过程
使用CALL命令可以调用已定义的存储过程。
语法格式:CALL [schema.] {func_name| procedure_name} ( param_expr );
其中参数列表param_expr可以用符号":="或者"=>"将参数名和参数值隔开,这种方法的好处是参数可以以任意顺序排列。若参数列表中仅出现参数值,则参数值的排列顺序必须和函数或存储过程定义时的相同。参数取值范围包括已存在的函数参数名称或存储过程参数名称。
[实例2] 调用排课存储过程并查看运行结果
3)删除存储过程
语法格式:DROP PROCEDURE [ IF EXISTS ] procedure_name ;
[实例3] 删除排课存储过程
(2)触发器的定义、修改、执行和删除
1)定义或修改openGauss触发器
语法格式:
CREATE [ CONSTRAINT ] TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
ON table_name
[ FROM referenced_table_name ]
{ NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( condition ) ]
EXECUTE PROCEDURE function_name ( arguments );
其中event包含以下几种:
INSERT
UPDATE [ OF column_name [, ... ] ]
DELETE
TRUNCATE
参数中,重点关注function_name ,这是用户定义的触发器函数,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。触发器函数定义或修改的语法格式是:
CREATE [ OR REPLACE ] FUNCTION function_name
( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] )
RETURN RIGGER
[
{IMMUTABLE | STABLE | VOLATILE }
| {SHIPPABLE | NOT SHIPPABLE}
| {PACKAGE}
| {FENCED | NOT FENCED}
| [ NOT ] LEAKPROOF
| {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER |
AUTHID DEFINER | AUTHID CURRENT_USER
}
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { {TO | =} value | FROM CURRENT
][...]
{
IS | AS
} plsql_body
注意事项:
当前仅支持在普通行存表上创建触发器,不支持在列存表、临时表、unlogged表等类型表上创建触发器。如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。
[实例4] 基于排课表创建排课触发器函数和排课触发器
2)执行触发器
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行。一个数据表上可能定义了多个触发器,遵循如下的执行顺序:
执行该表上的BEFORE触发器;
激活触发器的SQL语句;
执行该表上的AFTER触发器。
[实例5] 向排课表中添加一条记录并检查激发排课触发器后的结果。
3)删除触发器
语法格式:
DROP TRIGGER [ IF EXISTS ] trigger_name ON table_name [ CASCADE | RESTRICT ];
参数中CASCADE表示级联删除依赖此触发器的对象。RESTRICT表示如果有依赖对象存在,则拒绝删除此触发器。此选项为缺省值。
[实例6] 删除排课触发器函数和排课触发器
指导教师实训中方法指导:
- 指导学生理清实训任务中的高校教务管理系统中排课和选课核心业务问题。
- 指导学生分析高校教务管理系统中的选课表、排课日志表、选课表、选课日志表的结构、高校教务管理系统数据库基本表之间的关系。
- 指导学生使用openGauss SQL定义和调用存储过程并验证执行结果。
- 指导学生使用openGauss SQL定义和执行触发器并验证触发效果。
- 给出一种解决实训项目的思路,启发学生探索新的解题思路,鼓励学生用多种方法完成实训项目,并比较不同的解决方案的适用范围。
6.实训原理及方案
思路方法及参考方案:
- 创建选课数据库
分析题目要求,创建数据库选课数据库dbCourseSelect。
[ouser@openEuler2203 ~]$ gsql -d postgres -p 5432数据库超级用户ouser通过gsql登录数据库
gsql ((openGauss 2.1.0 build 590b0f8e) compiled at 2024-03-20 14:29:04 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
openGauss=#openGauss=# -- 创建表空间ts_student1
CREATE TABLESPACE ts_student1 RELATIVE LOCATION 'tablespace/ts_student11';
-- 创建数据库studb,数据库默认的表空间是ts_student1
CREATE DATABASE dbCourseSelect WITH TABLESPACE =ts_student1;
openGauss=# CREATE TABLESPACE
openGauss-# \q
- 创建数据库序列和基本表
创建序列sq_cslog_cstlogsn。
--创建序列sq_cslog_cslogsn,序列起点为1,
--每次递增1,序列到达最大值时不可循环,不关联表字段。
CREATE SEQUENCE sq_cslog_cslogsn
START WITH 1
INCREMENT BY 1
NOCYCLE
CACHE 1
OWNED BY NONE;
创建专业分类表、专业表、院部表、教师表、班级表、学生表、角色表、用户表、日志表、课程表、学期表、校区表、教室表、排课表、排课明细表、选课表等基本表。
--创建专业分类表majortype
CREATE TABLE majortype (
majortypeid varchar(4) NOT NULL,
majortypename varchar(100) NOT NULL,
CONSTRAINT majortype_pkey PRIMARY KEY (majortypeid)
);
--创建专业表major
CREATE TABLE major (
majorid varchar(7) NOT NULL,
majorname varchar(100) NOT NULL,
majortypeid char(4) NOT NULL,
CONSTRAINT major_pkey PRIMARY KEY (majorid),
CONSTRAINT major_majortypeid_fkey FOREIGN KEY (majortypeid) REFERENCES majortype(majortypeid)
);
--创建院系表department
CREATE TABLE department (
departmentid char(2) NOT NULL,
departmentname varchar(100) NOT NULL,
CONSTRAINT department_pkey PRIMARY KEY (departmentid);
CONSTRAINT unq_course UNIQUE (departmentname)
);
--创建教师表teacher
CREATE TABLE teacher (
teacherid char(5) NOT NULL,
teachername varchar(40) NOT NULL,
departmentid char(2) NOT NULL,
CONSTRAINT teacher_pkey PRIMARY KEY (teacherid),
CONSTRAINT teacher_departmentid_fkey FOREIGN KEY (departmentid) REFERENCES department(departmentid)
);
--创建班级表class
CREATE TABLE class (
classid char(6) NOT NULL,
classname varchar(40) NOT NULL,
teacherid char(5) NOT NULL,
departmentid char(2) NOT NULL,
CONSTRAINT pk_class PRIMARY KEY (classid),
CONSTRAINT fk_class1 FOREIGN KEY (teacherid) REFERENCES teacher(teacherid),
CONSTRAINT fk_class2 FOREIGN KEY (departmentid) REFERENCES department(departmentid)
);
--创建学生表student
CREATE TABLE student (
studentid char(11) NOT NULL,
studentname varchar(80) NOT NULL,
sex char(4) DEFAULT '男'::bpchar,
birthday char(10),
majorid varchar(7) NOT NULL,
classid char(6) NOT NULL,
CONSTRAINT student_pkey PRIMARY KEY (studentid),
CONSTRAINT fk_student2 FOREIGN KEY (classid) REFERENCES class(classid),
CONSTRAINT student_majorid_fkey FOREIGN KEY (majorid) REFERENCES major(majorid)
);
--创建角色表actor
CREATE TABLE actor (
actorid char(2) NOT NULL,
actorname varchar(80) NOT NULL,
authoritys varchar(1000) NULL,
CONSTRAINT actor_pkey PRIMARY KEY (actorid)
);
--创建用户表csuser
CREATE TABLE csuser (
csuserid varchar(11) NOT NULL,
csusername varchar(80) NOT NULL,
tsid varchar(11) NOT NULL,
pwd varchar(100) NULL,
actorid char(2) NOT NULL,
ip varchar(15) NULL,
logintime date NOT NULL,
CONSTRAINT csuser_pkey PRIMARY KEY (csuserid),
CONSTRAINT fk_csuser1 FOREIGN KEY (actorid) REFERENCES actor(actorid)
);
--创建课程表course
CREATE TABLE course (
courseid varchar(10) NOT NULL,
coursename varchar(100) NOT NULL,
majorid varchar(7) NOT NULL,
coursetype varchar(20) NOT NULL,
credit real DEFAULT 4.0 NOT NULL,
departmentid char(2) NOT NULL,
CONSTRAINT pk_course PRIMARY KEY (courseid),
CONSTRAINT unq_course1 UNIQUE (courseid),
CONSTRAINT fk_course2 FOREIGN KEY (departmentid) REFERENCES department(departmentid),
CONSTRAINT chk_course_coursetype CHECK (((coursetype)::text = ANY ((ARRAY['必修课程'::varchar, '选修课程'::varchar])::text[]))),
CONSTRAINT fk_course1 FOREIGN KEY (majorid) REFERENCES major(majorid)
);
--创建学期表term
CREATE TABLE term (
termid char(20) NOT NULL,
termname varchar(40) NOT NULL,
CONSTRAINT term_pkey PRIMARY KEY (termid);
CONSTRAINT unk_term_termname UNIQUE (termname)
);
--创建校区表schoolarea
CREATE TABLE schoolarea (
schoolareaid char(1) NOT NULL,
schoolareaname varchar(40) NOT NULL,
CONSTRAINT pk_schoolarea PRIMARY KEY (schoolareaid)
);
--创建教室类型表classroomtype
CREATE TABLE classroomtype (
classroomtypeid char(2) NOT NULL,
classroomtypename varchar(40) NOT NULL,
CONSTRAINT pk_classroomtype PRIMARY KEY (classroomtypeid)
);
--创建教室表classroom
CREATE TABLE classroom (
classroomid char(7) NOT NULL,
classroomname varchar(40) NOT NULL,
doorid varchar(40) NOT NULL,
tablenumber integer NOT NULL,
classroomtypeid char(2) NOT NULL,
schoolareaid char(1) NOT NULL,
CONSTRAINT pk_classroom PRIMARY KEY (classroomid),
CONSTRAINT fk2_classroom FOREIGN KEY (schoolareaid) REFERENCES schoolarea(schoolareaid),
CONSTRAINT fk1_classroom FOREIGN KEY (classroomtypeid) REFERENCES classroomtype(classroomtypeid)
);
--创建排课表courseschedule
CREATE TABLE courseschedule (
coursescheduleid varchar(40) NOT NULL,
classsn integer NOT NULL,
courseid char(7) NOT NULL,
termid char(20) NOT NULL,
teacherid char(5) NOT NULL,
CONSTRAINT pk_courseschedule PRIMARY KEY (coursescheduleid),
CONSTRAINT fk3_courseschedule FOREIGN KEY (teacherid) REFERENCES teacher(teacherid),
CONSTRAINT fk2_courseschedule FOREIGN KEY (termid) REFERENCES term(termid),
CONSTRAINT fk1_courseschedule FOREIGN KEY (courseid) REFERENCES course(courseid)
);
--创建排课明细表coursescheduledetails
CREATE TABLE coursescheduledetails (
coursescheduledetailssn bigint DEFAULT nextval('seq_coursescheduledetailssn'::regclass) NOT NULL,
coursetime varchar(80) NOT NULL,
classroomid char(7) NOT NULL,
coursescheduleid varchar(40) NOT NULL,
CONSTRAINT pk_coursescheduletimeaddress PRIMARY KEY (coursescheduledetailssn)
CONSTRAINT fk2_coursescheduletimeaddress FOREIGN KEY (coursescheduleid) REFERENCES courseschedule(coursescheduleid),
CONSTRAINT fk1_coursescheduletimeaddress FOREIGN KEY (classroomid) REFERENCES classroom(classroomid)
);
--创建日志表
CREATE TABLE cslog (
logsn bigint DEFAULT nextval('sq_cslog_cslogsn') NOT NULL,
title varchar(80) NOT NULL,
happentime timestamp(0) NOT NULL,
csuserid varchar(11) NOT NULL,
ip inet NULL,
CONSTRAINT cslog_pkey PRIMARY KEY (cslogsn)
);
--创建选课表
CREATE TABLE sc (
studentid char(11) NOT NULL,
coursescheduleId varchar(40) NOT NULL,
CONSTRAINT pk_sc PRIMARY KEY (studentid,coursescheduleid),
CONSTRAINT sc_studentid_fkey FOREIGN KEY (studentid) REFERENCES student(studentid),
CONSTRAINT sc_coursescheduleid_fkey FOREIGN KEY (coursescheduleid) REFERENCES courseschedule(coursescheduleid)
);
(3)向表中添加记录。
提示:通过insert into语句依次向专业分类表、专业表、院部表、教师表、班级表、学生表、课程表、学期表、校区表、教室表、排课表、排课明细表中添加若干条记录。
(4)创建存储过程并调用。
--创建存储过程p_insert_sc
CREATE OR REPLACE PROCEDURE p_insert_sc(
IN csuserid_1 csuser.csuserid%type,
IN ip_2 cslog.ip%type,
IN coursescheduleId_3 courseschedule.coursescheduleid%type,
IN title_4 cslog.title%type)
AS DECLARE
BEGIN
/*1.获取studentid*/
SELECT studentid from csuser
WHERE csuserid=csusserid_1;
/*2.向sc表中添加记录*/
INSERT INTO sc(studentId,coursescheduleId)
VALUES(csuserId_1,coursescheduleId_3);
/*3.向cslog表中添加记录*/
INSERT INTO cslog (title,happenTime,csuserid,ip)
VALUES (title_4,sysdate,csuserid_1,ip_2);
COMMIT; --提交事务
END;
/
--执行存储的过程p_insert_sc
CALL p_insert_sc(
'20220540103',
'192.168.111.212',
'(2022-2023-2)-B083852-01',
'选课'
);
--查看执行结果
--查询选课表
SELECT * FROM sc;
--查询选课系统日志表
SELECT * FROM cslog;
(5)创建触发器并执行。
--创建触发器函数tf_insert_sc
CREATE OR REPLACE FUNCTION tf_insert_sc ()
RETURNS TRIGGER
AS
$$
DECLARE
csuserid_1 varchar(11);
ip_2 varchar(15);
BEGIN
/*1.查询得到studentId对应的csuserid和ip*/
csuserid_1:=(SELECT csuser.csuserid
FROM csuser INNERE JOIN student
ON csuser.tsid=student.studentid
WHERE student.studentid= NEW.studentId);
ip_2:=(SELECT csuser.ip
FROM csuser INNERJOIN student
ON csuser.tsid=student.studentid
WHERE student.studentid= NEW.studentId);
/*2.cslog表中添加记录*/
INSERT INTO cslog (title,happenTime,csuserid,ip)
VALUES ('新增选课',SYSDATE, csuserid_1,ip_2);
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
--创建insert触发器tr_insert_sc
CREATE TRIGGER tr_insert_sc AFTER
INSERT
ON student.sc
FOR EACH STATEMENT
EXECUTE PROCEDURE tf_insert_sc();
--创建触发器函数tf_update_sc
CREATE OR REPLACE FUNCTION student.tf_update_sc ()
RETURNS TRIGGER
AS
$$
DECLARE
csuserid_1 varchar(11);
ip_2 varchar(15);
BEGIN
/*1.查询得到studentId对应的csuserid和ip*/
csuserid_1:=(SELECT csuser.csuserid
FROM csuser INNERE JOIN student
ON csuser.tsid=student.studentid
WHERE student.studentid= OLD.studentId);
ip_2:=(SELECT csuser.ip
FROM csuser INNERJOIN student
ON csuser.tsid=student.studentid
WHERE student.studentid= OLD.studentId);
/*2.courseselectlog表中添加记录*/
INSERT INTO courseselectlog (title,happenTime,csuserid,ip)
VALUES ('修改选课',SYSDATE, csuserid_1,ip_2);
RETURN OLD;
END;
$$ LANGUAGE PLPGSQL;
/
--创建update触发器tr_update_sc
CREATE TRIGGER tr_update_sc AFTER
UPDATE
ON student.sc
FOR EACH STATEMENT
EXECUTE PROCEDURE tf_update_sc();
--创建触发器函数tf_delete_sc
CREATE OR REPLACE FUNCTION student.tf_delete_sc ()
RETURNS TRIGGER
AS
$$
DECLARE
csuserid_1 varchar(11);
ip_2 varchar(15);
BEGIN
/*1.查询得到studentId对应的csuserid和ip*/
csuserid_1:=(SELECT csuser.csuserid
FROM csuser INNERE JOIN student
ON csuser.tsid=student.studentid
WHERE student.studentid= OLD.studentId);
ip_2:=(SELECT csuser.ip
FROM csuser INNER JOIN student
ON csuser.tsid=student.studentid
WHERE student.studentid= OLD.studentId);
/*2.courseselectlog表中添加记录*/
INSERT INTO courseselectlog (title,happenTime,csuserid,ip)
VALUES ('取消选课',sysdate, csuserid_1,ip_2);
RETURN OLD;
END;
$$ LANGUAGE PLPGSQL;
/
--向选课表中增加记录
INSERT INTO sc(studentId,coursescheduleId,grade)
VALUES('20220540102', '(2022-2023-2)-B083852-01',NULL);
--查看执行结果
SELECT * FROM sc;
SELECT * FROM csLog
ORDER BY cslogsn DESC
LIMT 1;
- 分析实验结果
提示:分析分别采用openGauss数据库的存储过程和触发器解决数据库完整型性问题的两种思路的效果。
(7)总结
提示:总结openGauss数据库存储过程的适用条件和定义、修改、调用和删除存储过程的方法;总结openGauss数据库触发器的应用场合和定义、修改、激发和删除触发器的方法;总结在解决数据库完整型性问题采用openGauss数据库的存储过程或触发器的两种方案的优缺点。
7.实验报告要求
参加实训的学生在实训课程结束时提供实验报告电子(Word格式)及打印文档各一份。
实验报告应包含以下主要内容:
(1)详细的需求分析。
(2)说明解决该问题的思路。
(3)实验环境说明。
(3)给出详细的程序清单和运行结果。
(4)实验结果分析和总结。
8.考核要求与方法
具体的实训项目考核要求见表1评分标准。
表1 评分标准(总分100)
序号 |
评价项目 |
评分标准 |
分值 |
1 |
问题分析 |
实验目的明确,问题界定正确[0-5]分,有详细的业务问题分析过程[0-5]分。 |
10 |
2 |
实验原理或设计思路 |
实验原理、设计思路或问题的解决方案正确[0-10]分。 |
10 |
3 |
实验步骤 |
能按照实验任务或要求设计实验,实验步骤正确、完整,有详细的数据库基本表、存储过程、触发器、查询等openGauss SQL编码[0-40]分。 |
40 |
4 |
实验结果分析 |
有完整的实验数据[0-5]分,有详细的实验结果分析过程[0-10]分。 |
15 |
5 |
实验总结 |
简要描述实验要解决的主要问题[0-5]分和实验方法[0-5]分,实验结果或结论正确[0-5]分。 |
15 |
6 |
文档资料 |
实验报告条理清楚、论述充分、文字通顺、符合技术规范、编号齐全、排版工整[0-10]分。 |
10 |
9.案例特色或创新
设计openGauss数据库存储过程和触发器实现数据库完整性实训项目特色主要体现在对关系数据库知识应用的综合性。
实训项目综合应用到关系数据库与关系数据理论、数据库完整性、openGauss SQL语法、openGauss数据库核心对象存储过程、函数和触发器管理等知识,只有系统掌握这些知识并通过多个综合案例训练才能达到提升综合应用能力。
10.案例应用
该案例项目作为设计型实验项目应用于本校2022-2023学年第二学期《大型数据库技术》和2023-2024学年第二学期《数据库原理》课程实践教学中。
- 点赞
- 收藏
- 关注作者
评论(0)