存储过程与触发器的简单学习

为什么需要存储过程?

在没有使用存储过程的数据库应用程序中,用户所编写的应用程序都是从本地计算机(client)向服务器(server)端发送SQL代码来请求对数据库中数据的增删改差操作,服务器对接收到的SQL代码进行编译后执行,并将结果返回给client,再由客户端的软件处理后输出。如果开发者对服务器安全性考虑不周全,就会为黑客提供盗取数据的机会。其中SQL注入是一种常见的方式。为了防止SQL注入过程泄露企业的商业机密,我们可以通过存储过程把对数据库操作的SQL代码预先编译好并保存在服务器端。这样既减少了网络传输量,又能保证应用程序的运行性能。
这段话来自于 https://www.cnblogs.com/weilengdeyu/archive/2012/12/26/2834625.html

什么是存储过程?

存储过程(procedure)类似于C#语言中的方法,它是SQL语句和控制语句的预编译集合。存储过程保存在数据库里,可由应用程序调用执行。说的简单一点,存储过程就像数据库中运行的方法
这段话来自于 https://www.cnblogs.com/weilengdeyu/archive/2012/12/26/2834625.html

存储过程分类

  1. 系统存储过程:服务器已存在的存储过程,名称一般以SP_开头
  2. 用户存储过程:用户可以自定义存储过程,例如
    //无参数的存储过程
    create procedure user_insert //user_insert是存储过程名称
    as
    begin
    	insert into user(id, username, password) 
    	values(1, 'me', '123')
    end
    
    //有参数的存储过程
    //注意:procedure可以简写为proc
    create proc user_insert //user_insert是存储过程名称
    @username varchar(10),@password varchar(20) //参数
    as
    begin
    	insert into user(id, username, password) 
    	values(1, @username, @password)
    end
    

那么如何执行存储过程呢?

exec 存储过程名 [参数]
例如 exec user_insert ‘me’, ‘123’

什么是触发器?

  • 触发器是一种特殊类型的存储过程。一般的存储过程名称被直接调用,而触发器主要是通过事件触发而被执行
  • 触发器作用在表上,当表中数据发生变化时(insert、update、delete)自动强制执行。
  • 当执行新增操作时,会生成临时表inserted,存放新增的数据
  • 当执行删除操作时,会生产临时表deleted,存放删除的数据
  • 当执行修改操作时,会同时产生2个临时表,一个是inserted,存放的是新的数据,一个是deleted,存的是旧的数据

触发器的创建

create trigger user_trigger //user_trigger是触发器名称
on user //作用在user表上
for insert //触发事件是当user表插入数据,for表示的是当插入完成时才执行触发器,也可用after代替
as //触发器代码
begin
	select * into new_insert_user from inserted //把新插入的数据备份到new_insert_user表,在备份前new_insert_user表必须不存在
end

注意:

  1. 跟for(after)相似的用法还有instead of,instead of代表的是作用的那张表的数据变化的SQL语句不会执行,只会执行触发器的代码
  2. 触发事件可以写多个,例如for insert | update | delete,但是一般单独写一个
  3. inserted、deleted临时表只能用在触发器代码中

猜你喜欢

转载自blog.csdn.net/weixin_41239845/article/details/83143989