精华内容
下载资源
问答
  • 存储过程和触发器

    千次阅读 热门讨论 2013-07-30 21:56:22
    前几天,在技术交流会上,八期师哥提到了存储过程和触发器的区别和联系,原来只知道,触发器时存储过程的一种,在机房收费系统个人版中也用到了存储过程和触发器,自己却没有深究,只道是自己会用就好,却没有将这两...

            前几天,在技术交流会上,八期师哥提到了存储过程和触发器的区别和联系,原来我只知道,触发器时存储过程的一种,在机房收费系统个人版中也用到了存储过程和触发器,自己却没有深究,只道是自己会用就好,却没有将这两个拿出来好好的比较,好好的学习,心里着实惭愧。

            无论是存储过程还是触发器,在数据库中的作用都是很大的,存储过程和触发器都是SQL语句和流程控制语句的集合,就本质而言,触发器其实也是一种特殊的存储过程,那为什么要这样说呢?

            我个人认为,这是因为触发器和存储过程都是经过编译过的一组SQL语句,只不过说存储过程是要通过语句来调用才能实现,而触发器是通过某一个动作执行时或执行后自动调用,注意这个自动哦。打个比方,在一个图书馆管理系统中,当一个学生的学号发生改变时,我们希望他相应的借书记录仍然跟这个学生息息相关,即我们要更改他相应的借书记录中的学号,这时我们就可以使用触发器,在学号发生改变时触发修改借书记录中的学号这个事件。

           存储过程是这样定义的:它是一组为了完成特定功能的SQL语句集,经过编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果这个存储过程带有参数的话)来执行,实现对表的增删改查。

           也就是说存储过程其实就是SQL语句或者是流程控制语句的集合,也就是说就一个单纯的插入语句也可以作为一个存储过程来执行。同时,存储过程事先在SQL数据库中编译好,在用的时候可以直接使用存储过程名并赋给参数(如果带参数)就可以调用。由于存储过程事先编译好,所以说像某一包含大量SQL代码或被多次执行,那么它就会比一般的SQL语句执行速度快很多,但像那种批处理的SQL语句在执行时,每次都会对他进行编译优化,可能其速度会相对慢些。

           存储过程可以被作为一种安全机制来充分利用系统管理员通过执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据访问。另外存储过程还能有效防止SQL注入,对数据库操作时其实我们是在拼接SQL语句,在这个时候就会用到参数,如果传的是字符串,而是非参数,那么可能就有人利用你拼接字符串的思想,利用现有SQL语句,凭借另外的SQL语句,构成非本意SQL语句,对数据库操作,数据库安全性级别降低。

           触发器是这样定义的:触发器主要是通过事件进行触发而被执行,当对某一表在进行例如增删改的时候,SQL Server自动执行定义的一些SQL语句或者流程控制语句,从而确保对数据的处理符合由这些SQL语句定义的规则。

         触发器可以侦测数据库内的操作,并自动级联影响整个数据库的各项内容,比如说,某个表的触发器包含有对另外一个表的数据操作,而该操作又导致该表上触发器被处罚。这就为我们处理大量连续性的多表的操作提供了方便。我个人觉得,我们使用触发器仅仅是因为方便。触发器它并不能提高性能(至于为什么,这个我也不知道为什么会这样,找了很久资料也没找到原因)。

           虽然说使用触发器和存储过程都有很多好处,给我们提供处理数据的方便,但是它们仍然避免不了由这么一些缺点。

           对于存储过程来说,存储过程它的一致性比较差,代码可复用性也不好,比如说,获取学生信息,这个窗体获取的学生信息仅仅包含学生学号、班级、年级,但是另一个获取学生信息却包含学生学号、班级、姓名、年级、住址、备注、是否获得什么奖学金之类的,这样的话,虽然两个都是在获取学生信息,但是却要写两个存储过程,对表操作两次,两次都是获取学生信息,只是获取的内容不一样。

           对于触发器,由于其隐式存在,会让我们不容易维护,即可维护性不理想。比如说,系统做完了,文档完成了,但是编写文档的人却忘了将触发器写进去,这时,系统有问题了,非开发人员来维护,对某个功能,调试了很久,但是依然达不到自己想要的结果,反复检查,什么都没有错,怎么也找不到出错点。。。。浪费时间,浪费精力,有点费力不讨好。。。。

           所以说,我觉得,师哥说的有道理,尽量不用触发器,分情况使用存储过程。但是一定要会用,知道它怎么用。


          

           

    展开全文
  • 前几天,在技术交流会上,八期师哥提到了存储过程和触发器的区别和联系,原来我只知道,触发器时存储过程的一种,在机房收费系统个人版中也用到了存储过程和触发器,自己却没有深究,只道是自己会用就好,却没有将这...

    前几天,在技术交流会上,八期师哥提到了存储过程和触发器的区别和联系,原来我只知道,触发器时存储过程的一种,在机房收费系统个人版中也用到了存储过程和触发器,自己却没有深究,只道是自己会用就好,却没有将这两个拿出来好好的比较,好好的学习,心里着实惭愧。

            无论是存储过程还是触发器,在数据库中的作用都是很大的,存储过程和触发器都是SQL语句和流程控制语句的集合,就本质而言,触发器其实也是一种特殊的存储过程,那为什么要这样说呢?

            我个人认为,这是因为触发器和存储过程都是经过编译过的一组SQL语句,只不过说存储过程是要通过语句来调用才能实现,而触发器是通过某一个动作执行时或执行后自动调用,注意这个自动哦。打个比方,在一个图书馆管理系统中,当一个学生的学号发生改变时,我们希望他相应的借书记录仍然跟这个学生息息相关,即我们要更改他相应的借书记录中的学号,这时我们就可以使用触发器,在学号发生改变时触发修改借书记录中的学号这个事件。

           存储过程是这样定义的:它是一组为了完成特定功能的SQL语句集,经过编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果这个存储过程带有参数的话)来执行,实现对表的增删改查。

           也就是说存储过程其实就是SQL语句或者是流程控制语句的集合,也就是说就一个单纯的插入语句也可以作为一个存储过程来执行。同时,存储过程事先在SQL数据库中编译好,在用的时候可以直接使用存储过程名并赋给参数(如果带参数)就可以调用。由于存储过程事先编译好,所以说像某一包含大量SQL代码或被多次执行,那么它就会比一般的SQL语句执行速度快很多,但像那种批处理的SQL语句在执行时,每次都会对他进行编译优化,可能其速度会相对慢些。

           存储过程可以被作为一种安全机制来充分利用系统管理员通过执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据访问。另外存储过程还能有效防止SQL注入,对数据库操作时其实我们是在拼接SQL语句,在这个时候就会用到参数,如果传的是字符串,而是非参数,那么可能就有人利用你拼接字符串的思想,利用现有SQL语句,凭借另外的SQL语句,构成非本意SQL语句,对数据库操作,数据库安全性级别降低。

           触发器是这样定义的:触发器主要是通过事件进行触发而被执行,当对某一表在进行例如增删改的时候,SQL Server自动执行定义的一些SQL语句或者流程控制语句,从而确保对数据的处理符合由这些SQL语句定义的规则。

         触发器可以侦测数据库内的操作,并自动级联影响整个数据库的各项内容,比如说,某个表的触发器包含有对另外一个表的数据操作,而该操作又导致该表上触发器被处罚。这就为我们处理大量连续性的多表的操作提供了方便。我个人觉得,我们使用触发器仅仅是因为方便。触发器它并不能提高性能(至于为什么,这个我也不知道为什么会这样,找了很久资料也没找到原因)。

           虽然说使用触发器和存储过程都有很多好处,给我们提供处理数据的方便,但是它们仍然避免不了由这么一些缺点。

           对于存储过程来说,存储过程它的一致性比较差,代码可复用性也不好,比如说,获取学生信息,这个窗体获取的学生信息仅仅包含学生学号、班级、年级,但是另一个获取学生信息却包含学生学号、班级、姓名、年级、住址、备注、是否获得什么奖学金之类的,这样的话,虽然两个都是在获取学生信息,但是却要写两个存储过程,对表操作两次,两次都是获取学生信息,只是获取的内容不一样。

           对于触发器,由于其隐式存在,会让我们不容易维护,即可维护性不理想。比如说,系统做完了,文档完成了,但是编写文档的人却忘了将触发器写进去,这时,系统有问题了,非开发人员来维护,对某个功能,调试了很久,但是依然达不到自己想要的结果,反复检查,什么都没有错,怎么也找不到出错点。。。。浪费时间,浪费精力,有点费力不讨好。。。。

           所以说,我觉得,师哥说的有道理,尽量不用触发器,分情况使用存储过程。但是一定要会用,知道它怎么用

    摘自:http://blog.csdn.net/dandanzmc/article/details/9632601

    转载于:https://www.cnblogs.com/qiyongliang/p/3360762.html

    展开全文
  • 1,如果事务中有操作没有成功完成,则事务中所有操作都需要被回滚,回到事务执行前状态(要么全执行,要么全都不执行); 2,同时,该事务对数据库或者其他事务执行无影响,所有事务都好像在独立运行。...

    一、【事务概念】

    事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行。

    1,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行);

    2,同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

    二、【事务举例】

    用一个常用的“A 账户向 B 账户汇钱”的例子来说明如何通过数据库事务保证数据的准确性和完整性。熟悉关系型数据库事务的都知道从账户 A 到账户 B 需要 6 个操作,分别为:

    1.从 A 账户中把余额读出来(500)

    2. 对 A 账户做减法操作(500 - 100)

    3. 把结果写回 A 账户中(400)

    4. 从 B 账户中把余额读出来(500)

    5. 对 B 账户做加法操作(500 + 100)

    6. 把结果写回 B 账户中(600)

    三、【事务特性】

    并非任意的对数据库的操作序列都是数据库事务,事务应该具有 4 个属性,分别为:原子性、一致性、隔离性和持久性。这四个属性通常称为ACID特性。

    1.原子性(Atomicity):一个事务对数据库的所有操作,是一个不可分割的工作单元,这些操作要么全部被执行,要么都不执行;

    保证 1-6 所有过程要么都执行,要么都不执行。

    一旦在执行某一步骤的过程中发生问题,就需要执行回滚操作。

    假如执行到第 5 步的时候,B 账户突然不可用(比如被注销),那么之前的所有操作都应该回滚到执行事务之前的状态。

    2.一致性(Consistency):事务应确保数据库的状态从一个一致状态转为另一个一致状态,一致状态的含义是数据库中的数据应满足完整性约束;

    在转账之前,A 和 B 的账户中共有 500 + 500 = 1000 元钱。

    在转账之后,A 和 B 的账户中也应该共有 400 + 600 = 1000 元钱。

    也就是说,数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态。同时一致性还能保证账户余额不会变成负数等。

    注:一致性与原子性是密切相关的,原子性的破坏可能导致数据库的不一致,数据的一致性问题并不都和原子性有关。

    比如上面的例子,在第5 步的时候,对 B 账户做加法时只加了 50 元。那么,该过程可以符合原子性,但是数据的一致性就出现了问题。因此,事务的原子性与一致性缺一不可。

    3.隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;

    在 A 向 B 转账的整个过程中,只要事务还没有提交(commit),查询 A 账户和 B 账户的时候,两个账户里面的钱的数量都不会有变化。

    如果在 A 给 B 转账的同时,有另外一个事务执行了 C 给 B 转账的操作,那么当两个事务都结束的时候,B 账户里面的钱应该是 A 转给 B 的钱加上 C 转给 B 的钱再加上自己原有的钱。

    4.持久性(Durability):一个事务一旦提交,它对数据库的修改应该永久保存在数据库中。

    例如我们在数据库,用update语句更新某条记录时,会默认开启一个数据库事务,当我们执行(F8)这条语句后,再次查询这条记录,已经被更新,但没有提交事务,事务并没有对数据库产生影响。此时如果关闭查询窗口(出现故障),并未对数据库记录产生影响,只有将事务提交之后,这条记录才会真正并永久的更新。

     

    四、【事务并发】

    事务并发:一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库,数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性。

    并发问题归结:数据问题(脏读、幻读、不可重复读)、数据更新问题(更新丢失)

    1、【存储过程的概念】

    ① 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集。经编译后存储在数据库中。

    ② 存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(可以有参数,也可以没有)来执行它。

    ③ 存储过程是由 流控制 和 SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中。

    ④ 存储过程 可由应用程序通过一个调用来执行,而且允许用户声明变量。

    ⑤ 同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。

    2、【存储过程的优点】

    ① 存储过程的使用大大增强了SQL语言的功能和灵活性。

    存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

    ② 可保证数据的安全性和完整性。

    通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

    通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。(就像事务的原子性:要么事务内的所有SQL语句全部执行成功,要么全部不成功)

    ③ 在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。

    这种已经编译好的过程可极大地改善SQL语句的性能。

    由于执行SQL语句的大部分工作已经完成(因为已经提前经过编译),所以存储过程能以极快的速度执行。

    ④ 可以降低网络的通信量。

    客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语句相比自然数据量少了很多(在远程访问时体现出来)。

    ⑤ 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

    ⑥ 当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

    比如每一步对数据库的操作用一个事务来完成,把这些事务全都放在一个存储过程中。

    ⑦ 存储过程可以重复使用,可减少数据库开发人员的工作量。

    ⑧ 安全性高,可设定只有某些用户才具有对指定存储过程的使用权

    3、【存储过程缺点】

    ① 调试麻烦:但是用 PL/SQL Developer 调试很方便!弥补这个缺点。

    ② 移植问题:数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

    ③ 重新编译问题:因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

    比如A存储过程调用B存储过程,使用B的返回值作为参数,如果B的参数或返回值发生改变时,会对调用她的A产生影响,此时存储过程就要重新编译,设置成运行时刻自动编译。

    ④ 维护比较困难:如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

    4、【存储过程的种类】

    ① 系统存储过程:一般以sp_开头,用来进行系统的各项设定,获取配置信息,相关管理工作。

    ② 本地存储过程:用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。

    ③ 临时存储过程:分为两种存储过程:

    一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;

    二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

    ④ 远程存储过程:在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令(在SQL*Plus命令行窗口中)执行一个远程存储过程。

    ⑤ 扩展存储过程:扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。

    5、【存储过程的特性】

    1.存储过程与函数的区别

    ①返回值:函数只能返回一个变量,而存储过程可以返回多个。对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象

    ②存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。

    ③存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强,比较单一。

    2.存储过程与事务的区别

    ①存储位置:事务在程序中被调用,保存在调用以及实现它的代码中,存储过程可以在数据库客户端直接被调用,经编译后存储在数据库中。

    ②运行方式:事务在每次被调用的时候执行其中的SQL语句,存储过程预先经过编译,并不是每次被调用时都会执行一遍其中的SQL语句。

    ③事务有严格的一致性和原子性,使用的安全性高,存储过程则没有这些特性,在进行一些复杂的操作时,为了保证操作的准确性,可以在存储过程中调用事务,然后判断事务的执行结果是否成功来确保操作的准确性。

    3.触发器

    ①概念及作用

    触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如Update、 Insert、 Delete 这些操作时,SQL Server就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。

    触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:

    (1) 强化约束(Enforce restriction)

    触发器能够实现比CHECK 语句更为复杂的约束。

    (2) 跟踪变化(Auditing changes)

    触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。

    (3) 级联运行(Cascaded operation)。

    触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

    (4) 存储过程的调用(Stored procedure invocation)。

    为了响应数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作。

    由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类(Insert、 Update、Delete)的多个触发器能够对同一种数据操作采取多种不同的处理。

    总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。

    展开全文
  • 一、【事务概念】事务(Transaction)是指构成单一逻辑工作单元操作集合,要么完整地执行,要么完全不执行。1,如果事务中有操作没有成功完成,则事务中所有操作都需要被回滚,回到事务执行前状态(要么全...

    一、【事务概念】

    事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行。

    1,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行);

    2,同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

    二、【事务举例】

    用一个常用的“A 账户向 B 账户汇钱”的例子来说明如何通过数据库事务保证数据的准确性和完整性。熟悉关系型数据库事务的都知道从账户 A 到账户 B 需要 6 个操作,分别为:

    1.从 A 账户中把余额读出来(500)

    2. 对 A 账户做减法操作(500 - 100)

    3. 把结果写回 A 账户中(400)

    4. 从 B 账户中把余额读出来(500)

    5. 对 B 账户做加法操作(500 + 100)

    6. 把结果写回 B 账户中(600)

    三、【事务特性】

    并非任意的对数据库的操作序列都是数据库事务,事务应该具有 4 个属性,分别为:原子性、一致性、隔离性和持久性。这四个属性通常称为ACID特性。

    1.原子性(Atomicity):一个事务对数据库的所有操作,是一个不可分割的工作单元,这些操作要么全部被执行,要么都不执行;

    保证 1-6 所有过程要么都执行,要么都不执行。

    一旦在执行某一步骤的过程中发生问题,就需要执行回滚操作。

    假如执行到第 5 步的时候,B 账户突然不可用(比如被注销),那么之前的所有操作都应该回滚到执行事务之前的状态。

    2.一致性(Consistency):事务应确保数据库的状态从一个一致状态转为另一个一致状态,一致状态的含义是数据库中的数据应满足完整性约束;

    在转账之前,A 和 B 的账户中共有 500 + 500 = 1000 元钱。

    在转账之后,A 和 B 的账户中也应该共有 400 + 600 = 1000 元钱。

    也就是说,数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态。同时一致性还能保证账户余额不会变成负数等。

    注:一致性与原子性是密切相关的,原子性的破坏可能导致数据库的不一致,数据的一致性问题并不都和原子性有关。

    比如上面的例子,在第5 步的时候,对 B 账户做加法时只加了 50 元。那么,该过程可以符合原子性,但是数据的一致性就出现了问题。因此,事务的原子性与一致性缺一不可。

    3.隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;

    在 A 向 B 转账的整个过程中,只要事务还没有提交(commit),查询 A 账户和 B 账户的时候,两个账户里面的钱的数量都不会有变化。

    如果在 A 给 B 转账的同时,有另外一个事务执行了 C 给 B 转账的操作,那么当两个事务都结束的时候,B 账户里面的钱应该是 A 转给 B 的钱加上 C 转给 B 的钱再加上自己原有的钱。

    4.持久性(Durability):一个事务一旦提交,它对数据库的修改应该永久保存在数据库中。

    例如我们在数据库,用update语句更新某条记录时,会默认开启一个数据库事务,当我们执行(F8)这条语句后,再次查询这条记录,已经被更新,但没有提交事务,事务并没有对数据库产生影响。此时如果关闭查询窗口(出现故障),并未对数据库记录产生影响,只有将事务提交之后,这条记录才会真正并永久的更新。

    四、【事务并发】

    事务并发:一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库,数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性。

    并发问题归结:数据问题(脏读、幻读、不可重复读)、数据更新问题(更新丢失)

    一、【存储过程的概念】

    ① 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集。经编译后存储在数据库中。

    ② 存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(可以有参数,也可以没有)来执行它。

    ③ 存储过程是由 流控制 和 SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中。

    ④ 存储过程 可由应用程序通过一个调用来执行,而且允许用户声明变量。

    ⑤ 同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。

    二、【存储过程的优点】

    ① 存储过程的使用大大增强了SQL语言的功能和灵活性。

    存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

    ② 可保证数据的安全性和完整性。

    通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

    通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。(就像事务的原子性:要么事务内的所有SQL语句全部执行成功,要么全部不成功)

    ③ 在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。

    这种已经编译好的过程可极大地改善SQL语句的性能。

    由于执行SQL语句的大部分工作已经完成(因为已经提前经过编译),所以存储过程能以极快的速度执行。

    ④ 可以降低网络的通信量。

    客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语句相比自然数据量少了很多(在远程访问时体现出来)。

    ⑤ 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

    ⑥ 当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

    比如每一步对数据库的操作用一个事务来完成,把这些事务全都放在一个存储过程中。

    ⑦ 存储过程可以重复使用,可减少数据库开发人员的工作量。

    ⑧ 安全性高,可设定只有某些用户才具有对指定存储过程的使用权

    三、【存储过程缺点】

    ① 调试麻烦:但是用 PL/SQL Developer 调试很方便!弥补这个缺点。

    ② 移植问题:数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

    ③ 重新编译问题:因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

    比如A存储过程调用B存储过程,使用B的返回值作为参数,如果B的参数或返回值发生改变时,会对调用她的A产生影响,此时存储过程就要重新编译,设置成运行时刻自动编译。

    ④ 维护比较困难:如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

    四、【存储过程的种类】

    ① 系统存储过程:一般以sp_开头,用来进行系统的各项设定,获取配置信息,相关管理工作。

    ② 本地存储过程:用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。

    ③ 临时存储过程:分为两种存储过程:

    一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;

    二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

    ④ 远程存储过程:在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令(在SQL*Plus命令行窗口中)执行一个远程存储过程。

    ⑤ 扩展存储过程:扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。

    五、【存储过程的特性】

    1.存储过程与函数的区别

    ①返回值:函数只能返回一个变量,而存储过程可以返回多个。对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象

    ②存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。

    ③存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强,比较单一。

    2.存储过程与事务的区别

    ①存储位置:事务在程序中被调用,保存在调用以及实现它的代码中,存储过程可以在数据库客户端直接被调用,经编译后存储在数据库中。

    ②运行方式:事务在每次被调用的时候执行其中的SQL语句,存储过程预先经过编译,并不是每次被调用时都会执行一遍其中的SQL语句。

    ③事务有严格的一致性和原子性,使用的安全性高,存储过程则没有这些特性,在进行一些复杂的操作时,为了保证操作的准确性,可以在存储过程中调用事务,然后判断事务的执行结果是否成功来确保操作的准确性。

    3.触发器

    ①概念及作用

    触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如Update、 Insert、 Delete 这些操作时,SQL Server就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。

    触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:

    (1) 强化约束(Enforce restriction)

    触发器能够实现比CHECK 语句更为复杂的约束。

    (2) 跟踪变化(Auditing changes)

    触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。

    (3) 级联运行(Cascaded operation)。

    触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

    (4) 存储过程的调用(Stored procedure invocation)。

    为了响应数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作。

    由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类(Insert、 Update、Delete)的多个触发器能够对同一种数据操作采取多种不同的处理。

    总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。

    展开全文
  • 一、【事务概念】事务(Transaction)是指构成单一逻辑工作单元操作集合,要么完整地执行,要么完全不执行。1,如果事务中有操作没有成功完成,则事务中所有操作都需要被回滚,回到事务执行前状态(要么全...
  • 对照笔记和查阅相关资料了解了一下两者的区别和联系触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时...
  • oracle存储过程、函数、触发器和包

    千次阅读 2018-05-22 07:52:46
    存储过程的创建带参数的存储过程的使用存储过程的管理函数的创建使用触发器的类型作用程序包的创建使用存储过程1、存储过程的创建2、调用存储过程3、带参数的存储过程4、修改与删除存储过程5、查询存储过程的...
  • 触发器(Flip - Flop)是一个具有记忆功能,具有两个稳定状态信息存储器件,是构成多种时序电路最基本逻辑单元,也是数字逻辑电路中一种重要单元电路。  在数字系统计算机中有着广泛应用。触发器具有...
  • 相同点 truncate不带where子句delete, 以及drop都会删除表内数据 不同点: 1. truncate delete只删除数据不删除表结构... 依赖于该表的存储过程/函数将保留,但是变为invalid状态. 2.delete语句是dml,这个操作
  • 相同点: 1. truncate 不带where子句delete、以及drop都会删除表中数据; 2. drop 、truncate 都是DDL语句... drop会删除表被依赖约束、触发器、索引,依赖于该表的存储过程/函数保留但变为invalid状
  • 4.存储过程与函数有什么区别和联系?5.数据库三范式?6.什么是触发器?7.触发器存储过程的区别?8.什么是游标?9.如果数据库日志满了,会出现什么情况?10.关系型数据库和非关系型数据库区别11.索引的优缺点,什么...
  • 文章目录数据库原理SQL语言数据查询语句数据操作语句(DML)...函数区别和联系范式目的:第一范式(1NF)第二范式(2NF)第三范式(3NF)鲍依斯-科得范式(BCNF)第四范式(4NF)触发器触发器&存储过程的区别D...
  • Louis主要兴趣领域是数据库架构和用T-SQL编码,并且,他设计过许多数据库,在这许多年中编写过数以千计的存储过程和触发器。  Scott Klein是一位独立咨询师,对SQL Server、.NET和XML相关所有知识都充满热情。...
  • Louis主要兴趣领域是数据库架构和用T-SQL编码,并且,他设计过许多数据库,在这许多年中编写过数以千计的存储过程和触发器。  Scott Klein是一位独立咨询师,对SQL Server、.NET和XML相关所有知识都充满热情。...
  • 35、存储过程的优点概念 区别主变量 存储过程的优点:(1)运行效率高;(2)降低了客户机服务器之间通信量;(3)方便实施企业规则。 存储过程:由PL/SQL语句书写过程,这个过程经编译优化后存储在数据库...
  • 存储过程是什么?与函数区别与联系?各种范式区别?什么是触发器?事前触发事后触发的区别?语句级触发行级触发的区别?什么是游标?数据库日志满了,出现什么情况?unionunion all区别?什么是视图?结语 ...
  • 以下内容主要介绍描述了访问oracle数据经常用到的两个工具SQLPLUSPL/SQL tool之间的区别联系,该内容知识点只针对刚刚接触oracle不久的小白,oracle大牛请跳过~~~首先我们应该了解到PL/SQL是oracle的一种过程化...
  • 9.4.1 数据库存储过程和函数 214 9.4.2 SQL/PSM: 扩展SQL以指定持久存储模块 215 9.5 小结 216 复习题 216 练习题 216 实验题 217 选读文献 218 第三部分 数据库设计理论和方法学 219 第10章 ...
  • 4、存储过程与函数的区别 41 5、索引的作用?它的优点缺点是什么? 41 6、什么样的字段适合建索引 41 7、索引类型有哪些? 42 8、什么是事务?什么是锁? 42 9、什么叫视图?游标是什么? 43 10、视图的优缺点 43 ...
  • 8.1 主动数据库概念和触发器 145 8.1.1 主动数据库和Oracle触发器的一般模型 145 8.1.2 主动数据库的设计和实现 148 8.1.3 STARBURST系统中使用语句级主动规则的示例 150 8.1.4 主动数据库的潜在...
  • 4.什么是存储过程?它与函数有什么区别联系? 5.各种范式有什么作用? 6.什么是触发器? 7.如果数据库日志满了,会出现什么情况? 8. unionunion all有什么区别? 9.什么是视图? 1. SQL语言功能有哪些...
  • <div><p>最近关于 Serverless 讨论越来越多。看似与前端关系不大 Serverless,其实早已前端有了颇深渊源,...比如阿里云对象存储触发器,是基于阿里云 OSS 产品存取等事件触发;...
  • java面试宝典

    2013-02-28 16:04:01
    234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器...
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    3、存储过程触发器必须讲,经常被面试到? 92 4、数据库三范式是什么? 94 5、说出一些数据库优化方面经验? 95 6、unionunion all有什么不同? 96 7.分页语句 97 8.用一条SQL语句 查询出每门课都大于80分学生...
  • Java面试宝典-经典

    2015-03-28 21:44:36
    3、存储过程触发器必须讲,经常被面试到? 92 4、数据库三范式是什么? 94 5、说出一些数据库优化方面经验? 95 6、unionunion all有什么不同? 96 7.分页语句 97 8.用一条SQL语句 查询出每门课都大于80分学生...
  • Transact-SQL 权威指南--详细书签版

    热门讨论 2013-02-04 13:25:19
    第15章介绍存储过程和触发器,它是管理数据库、查询数据需要了解重要方面。第16到第19章分别介绍Transact—SQL一些高级应用,如Transact—SQL性能协调(tuning)、Transact—SQL管理、全文搜索、OLE自动化等。第...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    3、存储过程触发器必须讲,经常被面试到? 4、数据库三范式是什么? 5、说出一些数据库优化方面经验? 6、unionunion all有什么不同? 7.分页语句 8.用一条SQL语句 查询出每门课都大于80分学生姓名 9.所有...
  • 3、存储过程触发器必须讲,经常被面试到? 92 4、数据库三范式是什么? 94 5、说出一些数据库优化方面经验? 95 6、unionunion all有什么不同? 96 7.分页语句 97 8.用一条SQL语句 查询出每门课都大于80分学生...

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

存储过程和触发器的区别和联系