网站建设和网络优化请示,计算机毕业设计作品网站,网页设计与网站开发,网站的转盘游戏怎么做信息系统工程领域对数据安全的要求比较高#xff0c;MySQL 数据库管理系统普遍应用于各种信息系统应用软件的开发之中#xff0c;而角色与权限设计不仅关乎数据库中数据保密性的性能高低#xff0c;也关系到用户使用数据库的最低要求。在对数据库的安全性进行设计时#xf… 信息系统工程领域对数据安全的要求比较高MySQL 数据库管理系统普遍应用于各种信息系统应用软件的开发之中而角色与权限设计不仅关乎数据库中数据保密性的性能高低也关系到用户使用数据库的最低要求。在对数据库的安全性进行设计时为了保证数据的安全性和可靠性提出通过设置角色和权限实现对数据的安全访问然后通过编写代码进行实验以验证此方式解决数据库中数据安全问题的有效性。 目录
1 相关概念
1.1 存储过程简介
1.2 游标简介
1.3 处理程序简介
2 综合运用设计
2.1 设计基础表和条件
2.2 分析思路
2.3 代码实现及错误问题分析
2.4 优化后正确代码
3 结 论 在 MySQL 数据库下存储过程是非常重要的一项内容但要发挥存储过程的重要作用必须让存储过程结合游标、处理程序、流程控制语句对数据进行处理这样既能发挥出游标和处理程序的优势也能体现流程控制语句在数据库中的应用。利用数据库开发信息系统或开发网站平台时开发人员会编写大量代码有些功能是相似的代码会重复编写浪费开发人员的时间也会增加代码的冗余如果利用存储过程则可以简化开发人员的工作量并能减少数据在数据库和应用服务器之间的传输从而有效提高数据库的处理速度还可以提高数据库编程的灵活性。
1 相关概念
1.1 存储过程简介
存储过程是一批被编译了的语句的集合存储在数据库的服务器端用户仅需要通过指定存储过程名称来执行操作。存储过程具有良好的封装性被创建之后可在程序中被多次调用而不必重新编写该存储过程中的 SQL 语句后台管理人员可以随时对存储过程进行修改并不会影响到调用存储过程的应用程序源代码在存储过程中可以加入流程控制语句类似具有了 C 语言程序设计的功能可以解决数据库编程中的复杂问题。
存储过程的优点是可以处理复杂问题并且能提高执行的性能因为在服务器端由于执行完 1 次之后其执行过程就会存放在缓存中后面的多次调用执行仅需要执行缓存中的二进制代码即可既提高了性能又节约了时间。
1.2 游标简介
游标是用来存储结果集的数据类型用 SQL 语言从数据库中查询数据后结果往往是一个含有多条记录的结果集它放在内存的一块区域中游标会通过循环结构允许用户逐行地访问这些记录按照用户自己的意愿来显示和处理每一条记录。游标不能单独使用可以在存储过程或函数中使用。使用游标设计程序时必须有 4 个步骤声明游标、打开游标、获取数据、关闭游标。声明游标是开辟空间并存储查询结果集此时游标在第一条记录的前面打开游标是让游标指向查询结果集的第一条记录获取数据是从结果集中获取单条记录获取此条记录后游标自动指向下一条记录。关闭游标是释放资源无法再获取数据。
1.3 处理程序简介
处理程序用于解决数据库中的错误由于错误在执行程序时是不确定的当有错误出现时需要通过处理程序解决从而保证程序正常运行。当数据表中的记录数不确定的时候如果用游标来获取单行数据需要利用循环语句实现。由于记录条数不确定导致循环次数也不确定此时无法写出退出循环的条件语句所以需要用事先定义好的处理程序自动处理问题。
2 综合运用设计
2.1 设计基础表和条件
存储过程在处理数据量不同的数据时是无差别的在此设计问题时设计的问题并不复杂但是解决问题都需要用到存储过程、游标、处理程序和流程控制语句通过简单的问题简述复杂的应用。在此建立两个简单的成绩表 score 和score1分别包含姓名和分数两列代码为 create table score(name char(10),fsh float); insert into score values(zhaoli,82),(sunyu,50),(liqiang,95);
create table score1(name char(10),fsh float);-- 无记录
具体要求逐行获取第一个 score 表中的数据把 score表中的分数大于 80 的记录插入到第二个表 score1 中并验证代码的正确性。
2.2 分析思路
1把表中的记录逐行取出解决此问题需利用游标取出表中的数据并利用变量进行存储。如果单纯用 select 语句查询数据仅可以看到所有的查询结果并且结果集并不能被存储到其他数据表中。
2利用游标取数据的同时需要定义问题处理程序当游标获取不到数据的时候对问题进行处理此时定义处理程序也需要用到变量判定是否发现了问题。
3由于是逐行获取数据为了提高程序的可读性和简化代码需利用流程控制语句中的循环结构通过循环去匹配游标定位到数据表中的逐行记录。此时一定要考虑循环的次数避免出现死循环。所有循环结束的判定条件要和定义处理程序进行结合通过定义处理程序的变量获得退出循环 的条件。
4为了能够把获取到的数据添加到第二个表中还需要判定存放到变量中的记录的值是否符合条件利用条件判断语句解决问题。
5需要把各个代码段集合成一个整体去执行需要存储过程解决此问题。
2.3 代码实现及错误问题分析
对于没有经验的初学者而言通常会按照以上思路直接写出以下代码 delimiter // create procedure cc1()-- 第 1 行定义存储过程。 Begin-- 第 2 行和第 16 行是开始和结束的代码段。 declare f float default 0; declare x char(10);-- 第 3 行和第 4 行定义变量用于存放游标从数据表中取出的每一条记录的两个值。 declare t int default 0;-- 第 5 行用于给定义处理程序的变量赋值为 0。 declare c cursor for select * from score;--第6行为声明游标。 declare continue handler for not found set t1;-- 第 7 行代表定义处理程序当不能获取数据的时候此时设置变量 t为 1从而控制循环的退出。 open c;-- 第 8 行代表打开游标。 while t1 do-- 第 9-13 行代表循环控制语句通过循环取出数据并进行条件判定符合条件的存储到 score1 表中。 fetch c into x,f; -- 第 10 行代表获取表中数据 if f80 then insert into score1 values(x,f); end if; end while; close c;-- 第 14 行关闭游标 select * from score1;-- 第 15 行代表查看存入的数据以验证代码是否正确。 end// 通过编译可以看出代码编译过程无语法错误提示正确如图 1 所示。 下面执行存储过程会发现虽然编译正确但是执行结果是错误的。根据建立数据表时输入的 3 条记录判断应该有 2 条记录符合条件但这里显示了 3 条记录如图 2 所示。 通过以上执行结果发现score1 表中的最后两行是重复的正确结果应该不重复表中应该有两条符合条件的记录即第 1 条和第 2 条记录。错误原因分析如下
由于 score 表中有 3 条记录根据定义的处理程序和循环结构会循环 4 次去提取数据每次提取完成之后会把一条记录中的两个值赋值给变量 x 和 f在第 4 次循环取数据时由于没有记录可以获取此时变量 t 设置为 1所以第 4 次并未取到值给变量但是 x 和 f 的值是保留了第3 次取数据时所赋给的值并且符合大于 80 的条件此时又把此条记录加入 score2 表中。又因为定义处理程序时declare 后面的关键字是 continue当处理程序发现问题后程序会继续执行所以 score2 表中出现了重复的记录。如何解决这个问题仅需要在提取到数据的第 10 行代码后面加入条件即可。如图 3 所示。 调用修改后的存储过程 cc2可以得出正确的执行结果代码和结果如图 4 所示。 2.4 优化后正确代码
针对存储过程、游标、定义处理的应用以上代码已经是最简洁状态无法进行优化但在 while 循环结构中有两个 if 条件的嵌套使得代码的行数和可读性减弱可以在此基础上对代码进行优化两个 if 条件合并成一个 if 条件。结果不变但可以提高代码的可读性如图 5 所示。 在以上代码中针对定义处理程序的语法结构declare参数 1 handler for 参数 2SQL 语句。 参数 1exit 退出当前程序continue 继续执行程序。 参数 2not found 代表当 fetch 抓取不到数据的状态或者游标指针走到最后一条记录后面的状态。
SQL 语句set temp1temp 是变量必须提前声明其值只能是 0false或者 1(true)。在上面的代码中用到的参数为 continuecontinue 所代表的含义是当程序出现问题时定义的处理程序起作用并且代码继续执行也可以用 exit 实现此时代码不再执行直接跳出存储过程。除此之外对于循环中的条件和循环而言也可以用其他循环结构实现提高代码的灵活性。代码为 delimiter // create procedure cc4() begin declare f float default 0; declare x char(10); declare t int default 0; declare c cursor for select * from score where fsh80;-- 把循环结构中的if条件编辑到查询语句中提升代码的可读性。 declare exit handler for not found set t1;-- 此处用 exit 代替 continue当条件成立的时候退出整个存储过程。 open c; repeat– 此处用 repeat 循环代替 while 循环。 fetch c into x,f; insert into score1 values(x,f); until t1 end repeat; close c; select * from score1;-- 此行可以去掉因为是 exit循环截止的时候直接结束程序运行不会执行此行代码。
3 结 论
在设计数据库的过程中需要根据内容选择合适的数据库对象在选择之后还要考虑此数据库对象所需要加载的其他内容例如仅创建一个存储过程很简单但仅能解决简单问题遇到复杂问题或者数据表中的数据量特别大的情况就需要考虑知识的综合运用运用变量、游标、循环结构、条件结构、处理程序等多项内容进而解决复杂问题。此方案以简单数据表为例进行描述可为基于 MySQL 数据库的信息系统或信息平台提供借鉴以解决实际问题。在后续的研究中将进一步优化案例设计选择多个数据表的大数据量展开对比拟通过此种方式进一步挖掘综合运用方面的优势提供更宝贵的经验借鉴。