热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析数据库中的存储过程与触发器技术

本文深入探讨了数据库中的存储过程与触发器技术。存储过程是一组预编译的SQL语句,经过优化后存储在数据库服务器中,以提高执行效率。在大型数据库系统中,通过调用存储过程的名字,用户可以快速执行复杂的操作,从而提升系统的性能和响应速度。此外,触发器作为一种特殊的存储过程,能够在特定事件发生时自动执行,进一步增强了数据库的自动化管理和数据完整性。

一、存储过程

SQL语句在执行时先要编译,然后再被执行。在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字来调用执行。


下面是一个创建存储过程的常用语法:

create procedure sp_name @[参数名][类型]
						as
						begin
						......
						end
						

调用存储过程语法:

exec sp_name[参数名]

删除存储过程语法:

drop procedure sp_name

使用存储过程可以增强SQL语言的功能和灵活性,由于可以用流程控制语句编写存储过程,有很强的灵活性,因此可以完成复杂的判断和运算,并且可以保证数据的安全性和完整性。同时,存储过程可以使没有权限的用户在控制之下间接地存取数据库,也保证了数据的安全。


需要注意的是,存储过程不等于函数,二者虽然本质上没有区别,但还是有如下几个方面的不同:

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

2、一般而言,存储过程实现的功能较复杂,而函数实现的功能针对性较强。

3、函数需要括号包住输入的参数,并且只能返回一个值或表对象,而存储过程可以返回多个参数。

4、函数可以嵌入在SQL中使用,可以在SELECT调用,存储过程则不行。

5、函数不能直接操作实体表,只能操作内建表。

6、存储过程在创建时即在服务器上进行了编译,其执行速度比函数快。

二、触发器

触发器是一种特殊类型的存储过程,它由事件触发,而不是程序调用或手工启动,当数据库有特殊的操作时,这些操作由数据库中的事件来触发,自动完成这些SQL语句。使用触发器可以用来保证数据的有效性和完整性,完成比约束更复杂的数据约束。


触发器与存储过程的区别如下表所示:


根据SQL语句的不同,触发器可以分为DML触发器和DLL触发器。

DML触发器是当数据库服务器发生数据操作语言事件时执行的存储过程,有After和Instead Of这两种触发器。After触发器被激活触发是在记录改变之后进行的一种触发器。Instead Of触发器是在记录变更之前,去执行触发器本身所定义的操作,而不是执行原来SQL语句例的操作。


DDL触发器是在响应数据定义语言事件时执行的存储过程


触发器的作用主要表现为以下几个方面:

1)增加安全性。

2)利用触发器记录所进行的修改以及相关信息,跟踪用户对数据库的操作,实现审计。

3)维护那些通过创建表时的声明约束不可能实现的复杂的完整性约束以及对数据库中特定事件进行监控与响应。

4)实现复杂的非标准的数据库相关完整性规则、同步实时地复制表中的数据。

5)触发器是自动的,它们在对表中的数据做了任何修改之后就会被激活,例如可以自动计算数值,若数据的值达到了一定的要求,则进行特定的处理。以某企业财务管理为例,如果企业的资金出现短缺,并且达到某种程度时,则会发送警告信息。


下面是一个触发器的例子,该触发器的功能是在每周末进行数据表更新,若当前用户没有访问WEEKEND_UPDATE_OK表的权限,则需要重新赋予权限。

CREATE OR REPLACE TRIGGER update_on_weekends_check
BEFORE UPDATE OF sal ON EMP
FOR EACH ROW
DECLARE
my_count number(4);
BEGIN
SELECT COUNT(u_uname)
FROM WEEKEND_UPDATE_OK INTO my_count
WHERE u_uname = user_name;
IF my_count=0 THEN
RAISE_APPLICATION_ERROR(20508,'Update not allowed');
END IF;
END;


引申:触发器分为事前触发和事后触发,这两者有什么区别?语句级触发和行级触发有什么区别?

事前触发发生在事件发生之前,用于验证一些条件或进行一些准备工作;事后触发发生在事件发生之后,做收尾工作。事前触发器可以获得之前和新的字段值,而事后触发可以保证事务的完整性。


语句级触发可以在语句执行之前或之后执行,而行级触发在触发器所影响的每一行触发一次。


推荐阅读
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 解析SQL查询结果的排序问题及其解决方案
    本文探讨了为什么某些SQL查询返回的数据集未能按预期顺序排列,并提供了详细的解决方案,帮助开发者理解并解决这一常见问题。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 方法:1 配置数据库basediros.path.abspath(os.path.dirname(__file__))  #获取当前文件的绝对路径appFlask(__name__ ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • 本文介绍了一个SQL Server自定义函数,用于从字符串中提取仅包含数字和小数点的子串。该函数通过循环删除非数字字符来实现,并附带创建测试表、存储过程以演示其应用。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
author-avatar
奥巴马萨达姆_558
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有