存储过程触发器(存储过程和触发器有什么不同)
本文目录
存储过程和触发器有什么不同
首先介绍一下触发器: 触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。例如,可以控制是否允许基于顾客的当前帐户状态插入定单。 触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。有关详细信息,请参见表关系。 使用触发器的优点 触发器的优点如下: 触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。 触发器可以通过数据库中的相关表进行层叠更改。例如,可以在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。 触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其它表中的列。 再介绍存储过程: 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。总的来说,存储过程具有以下一些优点: ◆存储过程允许标准组件式编程 ◆存储过程能够实现较快的执行速度 ◆存储过程能够减少网络流量 ◆存储过程可被作为一种安全机制来充分利用 使用 SQL Server 中的存储过程而不使用存储在客户计算机本地的 Transact-SQL 程序的优势有: 允许模块化程序设计。 只需创建过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员创建,并可独立于程序源代码而单独修改。 允许更快执行。 如果某操作需要大量 Transact-SQL 代码或需重复执行,存储过程将比 Transact-SQL 批代码的执行要快。将在创建存储过程时对其进行分析和优化,并可在首次执行该过程后使用该过程的内存中版本。每次运行 Transact-SQL 语句时,都要从客户端重复发送,并且在 SQL Server 每次执行这些语句时,都要对其进行编译和优化。 减少网络流量。 一个需要数百行 Transact-SQL 代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。 可作为安全机制使用。 即使对于没有直接执行存储过程中语句的权限的用户,也可授予他们执行该存储过程的权限
如何在存储过程中建立触发器
(1).存储过程:createprocedurefor_select(你想用的触发器名字)delare@namechar(8)output(用于输出的),@ageintoutput(用于输出),@phone_numchar(11)(输入)asselect@name=name(列名),@age=age(列名)fromtable_name(表名)wherephone_num(列名)=@phone_num(2)触发器createtiggerfor_updateontable_nameafterupdateasif(update(phone_num))updatetable_name2setphone_num=i.phone_numfromdeletedd,insertediwheretable_name.phone_num=d.phone_numend其中:deleted与inserted是sql中默认的临时表。用来储存原来的值和插入的值。本触发器的作用是当更新table_name中的phone_num时table_name1中的phone_num也一起更新!注意触发器只能用于update.insert.delete.select中不能用于创建表............
请问存储过程与触发器关系
存储过程需要调用才执行里面的sql语句。触发器是设置好触发条件,条件达到时自动运行里面的sql语句,比如对a表进行更新(update)操作时,相应的触发器就会运行。
存储过程的触发器
触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如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)的多个触发器能够对同一种数据操作采取多种不同的处理。总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。 SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(Insert Update Delete) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。INSTEAD OF触发器表示并不执行其所定义的操作(Insert、 Update、 Delete),而仅是执行触发器本身。既可在表上定义INSTEAD OF触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。 Create procedure procedure_name{recompile|encryption}assql_statement解释:output:表示此参数是可传回的with {recompile|encryption}recompile:表示每次执行此存储过程时都重新编译一次encryption:所创建的存储过程的内容会被加密如:表book的内容如下编号 书名 价格001 C语言入门 $30002 PowerBuilder报表开发 $52实例1:查询表Book的内容的存储过程create proc query_bookasselect * from bookgoexec query_book实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额 Create proc insert_book@param1char(10),@param2varchar(20),@param3money,@param4moneyoutputwith encryption---------加密asinsert into book(编号,书名,价格)Values(@param1,@param2,@param3)select @param4=sum(价格) from bookgo执行例子:declare @total_price moneyexec insert_book ’003’,’Delphi控件开发指南’,$100,@total_price outputprint ’总金额为’+convert(varchar,@total_price)go存储过程的3种传回值:1)、以Return传回整数2)、以output格式传回参数3)、Recordset传回值的区别:output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。实例3:设有两个表为Product,Order_,其表内容如下:Product产品编号 产品名称 客户订数001 钢笔 30002 毛笔 50003 铅笔 100Order_产品编号 客户名 客户订金001 南山区 $30002 罗湖区 $50003 宝安区 $4请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,总金额=订金*订数,临时表放在存储过程中代码如下:Create proc temp_saleasselect a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额into #temptable from Product a inner join Order_ b on a.产品编号=b.产品编号-----此处要用别名if @@error=0print ’Good’elseprint ’Fail’go
Oracle存储过程触发器用法
1:什么叫存储过程?在oracle中,可以在数据库中定义子程序,这种程序块叫存储过程(procedure),它存放在数据字典中,可以在不同用户和应用程序中共享,并可以实现程序的优化和重用。2:存储过程的有点?过程运行在服务器端,执行速度快过程执行一次后代码就驻留在高速缓存中,在以后的操作中,直接调用缓存数据。确保数据库的安全性,可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问数据库的过程。自动完成需要预先执行的任务,过程可以在系统启动时自动运行。、3:存储过程的创建和执行用户存储过程只能定义在当前数据库中,可以使用sql语句或OEM创建。默认情况下,用户创建的存储过程归登录数据库的用户所拥有,DBA可以把许可授权给其他用户。Sql命令创建存储过程CREATEprocedure过程名【(parameterparameter_modedate_type,….n)】IS|ASBEGINSQL_STATEMENTEND过程名其中Parameter表示过程的参数。parameter_mode:参数的类型,过程参数和函数参数一样,有三种类型IN,OUT,INOUTIN表示参数是输入给过程的。OUT表示采纳数载过程中被赋值,可以传给过程的外部。INOUT表示可以传内,可以传外。调用存储过程直接输入存储过程的名字可以执行一个已经定义的存储过程。存储过程的修改修改存储过程虽然可以和修改视图一样,用ALTERprocedure,但是他是用来重新编译和验证用的,如果要修改过程定义,建议还是用createorreplace。存储过程的删除当某个过程不再需要的时候,应该将其从内存中删除,以释放它占用的资源。Dropprocedure存储过程名。Dropprocedureupdate_info.触发器触发器(trigger)是一些过程,与表联系紧密,用于保护表中的数据,当一个基表被修改时,触发器自动就会执行。例如出入其可以实现多个表间数据的一致性和完整性。一般情况下,对表数据的操作有增删查改,维护数据的触发器也可以分为多种,每张基表最多可以建立12个触发器。1:Beforeinsert2:beforeinsertfoeachrow;3:afterinert4:afterinsertforeachrow5:beforeupdate6:beforeupdateforeachrow7:afterupdate8:afterupdateforeachrow;9:beforedelete;10:beforedeleteforeachrow11:afterdelete12:afterdeleteforeachrow.利用sql语句创建触发器语法规则Createorreplacetrigger触发器名{before|after|insteadof}{delete【orinsert】【orupdate】【ofcolumn….n】}On表名|视图名【foreachrow】Sql_statement参数说明Insteadof:指定在创建替代触发器。Ofcolumn指定在哪些列上进行触发。。。创建触发器的限制1:触发器中有效的语句可以包括DML语句,但是不能包括DDL,rollback,commit,savepoint都不适用。
更多文章:
experiment是什么意思啊(experiment是什么意思)
2024年7月6日 02:33
java环境一键配置(burpsuite 怎么安装,据说需要java环境,我也安装了,可是点了.bat,它就闪退了)
2024年7月19日 08:49
randperm函数matlab(关于matlab的randperm语句)
2024年7月27日 12:55
java中equals的使用(JAVA中equals的用法)
2024年7月6日 18:51
jquery下拉菜单滑动效果(网页制作,慢慢下拉的菜单怎么做)
2024年7月4日 06:25
php框架用哪种编辑器(php程序员用什么编辑器最好 50分)
2024年5月20日 09:56
老板问:企业培训最终为了什么,我答:解决问题,提高效益,老板摇头,你们认为是什么?企业培训公司是做什么的怎么发展呢
2024年7月15日 10:04
printwriter中文乱码(JAVA读写文件,如何避免中文乱码)
2024年7月23日 00:15