转!!存储过程和触发器

1. 存储过程和触发器是什么?

存储过程不能可以显著提高系统的执行速度,还能提高效率确保一致性.

1.1存储过程:一种数据库对象,将负责不同功能的语句分类放置起来,以便能反复使用.

1.2特点:

1.3存储过程的分类

分为五类,系统存储过程,用户定义存储过程,临时存储过程,远程存储过程,扩展存储过程.

临时存储过程又分为本地临时存储过程,全局临时存储过程.


分类


说明


系统存储过程


存储在master中,以sp开头,调用时不必加库名,如果参数是保留字或者数据库对象,用单引号包围.


用户定义存储过程


用户为完成一定的功能定义在数据库中存储过程.


临时存储过程


本地临时:#开头,放在tempdb中,连接断开之后自动删除,本库使用.


全局临时:##开头,放在tempdb中,连接断开后使用完之后自动删除,本连接的所有库可以使用.注意命名.


远程存储过程


位于远程服务器上的存储过程.通过分布式查询和execute执行.


扩展存储过程


外部程序写的存储过程,xp开头,动态链接库形式存在,也放在master

1.4存储过程优点

1.5存储过程和视图的比较

1.6创建存储过程

格式:

例子:

create procedure ShowAllStudent

as

begin

select * from students

end

1.7执行存储过程

格式:exec procedure_name

例子:exec ShowAllStudent

1.8带输入参数存储过程

格式:

例子:

create procedure SelectStudentByStu_no

@sno char(12)=‘200501020319‘

as

begin

select * from students where [email protected]

end

1.9执行带输入参数的存储过程

格式:

例子:

exec SelectStudentByStu_no

@sno=‘200501030218‘

当参数比较少的时候,可以按照位置传递参数.

例子:

exec SelectStudentByStu_no ‘200501030218‘

1.10带输出参数的存储过程

格式:

例子:

create procedure GetStudentCountByStu_sex

@sex char(2)=‘男‘,

@count int=0 output

as

begin

set

@count=(select count(*) from students where [email protected])

print @count

end

执行带输出参数的存储过程

例子:

declare @sex char(2) ,@count int

set @sex=‘男‘

exec GetStudentCountByStu_sex @sex,@count

1.11 删除存储过程

Drop procedure GetPostsByBlogId

1.12 更新存储过程

alter procedure GetPostsByBlogId

(@blogid varchar(50))

As

Select top 5* from Posts where [email protected]

1.13 重命名存储过程

对象浏览器中修改.

1.14 重新编译存储过程

有三种方法:

1)创建的时候使用with Recompile 语句.

2)在执行过程中设定重新编译

3)调用系统存储过程重新编译

2. 触发器

基本表被在修改的时候通过事件触发而执行的存储过程.

作用是保证了由主键和外键所不能保证的参照完整性和数据完整性.

触发器原理:

  触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。
触发器的作用:
  触发器的主要作用是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。它能够对数据库中的相关表进行级联修改,强制比CHECK约束更复杂的数据完整性,并自定义操作消息,维护非规范化数据以及比较数据修改前后的状态。与CHECK约束不同,触发器可以引用其它表中的列。在下列情况下使用触发器实现复杂的引用完整性;强制数据间的完整性。创建多行触发器,当插入,更新、删除多行数据时,必须编写一个处理多行数据的触发器。执行级联更新或级联删除这样的动作。级联修改数据库中所有相关表。撤销或者回滚违反引用完整性的操作,防止非法修改数据。
触发器与存储过程的区别:

  触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。当一行被插入、更新或者删除时触发器才执行,同时还取决于触发器是怎样创建的,当UPDATE发生时使用一个更新触发器,当INSERT发生时使用一个插入触发器,当DELETE发生时使用一个删除触发器。

2.1触发器的优点

触发器可以包含复杂的处理逻辑,主要用来保持低级的数据完整性.优点如下.


 

2.2创建触发器

删除触发器:

 

例子:

create trigger dropStudent

on students

for delete

as

print ‘成功删除一条数据.‘

更新触发器:

create trigger updateStudentName

on students

for update

as

if update (stu_name)

begin

print ‘不能更新主键,学生号码.‘

rollback transaction

end

update students set

stu_name=‘五哥‘

where stu_no=‘200501020319‘

 

删除触发器:略

查看触发器:

1) 使用系统的存储过程查看: exec sp_helptrigger students

使用系统表: select name from sysobjects where type=‘TR‘

2) 管理器查看 略

删除触发器: drop trigger updateStudent

修改触发器:

 

重命名: sp_rename dropStudent,deleteStudentItem

启动和停止触发器:

alter table students enable trigger all

时间: 2024-10-05 15:19:54

转!!存储过程和触发器的相关文章

存储过程和触发器——MySQL

从MySQL5.0版本开始就对存储过程和触发器进行了支持,在MySQL进行学习前,先查看您所使用的版本吧,方法有: 1.$mysql -V  //linux终端下 2.select version();  //mysql下 3. mysql --help | grep Distrib  //linux终端下 在了解您所使用的版本支持情况下再下一步 存储过程  sql语句执行的时候要先编译,然后执行.存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数

mysql 自定义存储过程和触发器

mysql 自定义存储过程和触发器 --存储过程示范 DROP PROCEDURE IF EXISTS PRO_TEST; CREATE PROCEDURE PRO_TEST(IN NUM_IN INT,OUT NUM_OUT INT,INOUT NUM_INOUT) BEGIN //DO ANYTHING YOU WANT END; 参数解释: in : 就是输入参数,输入参数是会被传入到存储过程作为参数使用,改变它的值将不会改变其原本值,相当于是值传递 out: 此为输出参数,在存储过程中为

MSSQL 事务,视图,索引,存储过程,触发器

事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据通信系统.例如:订票.银行.保险公司以及证券交易系统等. 如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库的永久组成部分,如果事务遇到错误且必须取消或回滚,则所有数据修改均会被清除. 开始事务 BEGIN TRANSACTION 提交事务 COMMIT TRANSACTION 回

mysql的存储过程和触发器的使用 以及php中的调用方法

存储过程顾名思义,相当于一组为了完成特定功能的sql语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程的书写格式:  CREATE PROCEDURE [拥有者.]存储过程名[;程序编号]  [(参数#1,-参数#1024)]  [WITH  {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}  ] 

oracle 存储过程 ,触发器练习

/*以下代码是对emp表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr for 9999;col hiredate for a12;col sal for 9999;col comm for 9999;col deptno for 99;col tname for a12;set pagesize 50; //----------------------------------------------

SQL基本编程,分支语句,循环语句,存储过程,触发器

基本编程: 定义变量 declare @变量名 数据类型 赋值 set @变量名 = 值 select @变量名 = 值 取值打印 select @变量名 print @变量名 映射到结果集 打印到消息框 分支语句if @a>@bbegin 语句....endelsebeginend 循环语句注意循环四要素:初始条件,循环条件,循环体,状态改变 declare @a int;select @a = 1; while 循环条件 @a<=10begin 循环体end 存储过程: 存储过程是集中存储

Sqlserver中存储过程,触发器,自定义函数(一)

Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. 1.1存储过程的定义:存放在服务器上预先编译好的sql语句,可以给存储过程传递参数,也可以从存储过程返回值. 优点:提供了安全访问机制,比如可以将不同的存储过程的执行权限赋予权限不同的用户:改进了执行性能,因为存储过程是预编译的:减少了网络流量,因为在调用存储过程时,传递的字符串很短,没有很长的s

T-SQL应用,视图、存储过程、触发器、游标、临时表等

sqlserver常用操作: 视图.存储过程.触发器.函数 --*********************批处理********************* --[在一个批处理中存有一个语法错误,则所有的语句都无法通过编译] USE flowershopdb SELECT * FROM tb_category SELECT * FROM tb_detailed SELECT * FROM tb_product SELECT * FROM tb_shopping SELECT * FROM tb_u

mysql存储过程和触发器的应用

***********[mysql 存储过程和触发器 -- 别安驹]********************* 1.什么情况下使用存储过程? 完成一些比较麻烦的逻辑,比如多表在mysql端的cpu很空闲的情况下,用存储过程是不错的选择, 1.1.简单的存储过程示例:简单写入 DELIMITER $$ USE `curl_test`$$ DROP PROCEDURE IF EXISTS `data_s`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `

用SQL语句查找包含有某个关键字的存储过程、触发器、函数等(仅适用MS SQL SERVER)

原文:用SQL语句查找包含有某个关键字的存储过程.触发器.函数等(仅适用MS SQL SERVER) 第一种方法:利用系统表进行查询 --将text替换成你要查找的内容 select name from sysobjects o, syscomments s where o.id = s.id and text like '%text%' and o.xtype = 'P' xtype:对象类型.可以是下列对象类型中的一种: C = CHECK 约束 D = 默认值或 DEFAULT 约束 F