热门标签 | 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;


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

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


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


推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
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社区 版权所有