当前位置: 首页 > news >正文

存储过程和触发器

目录

1、存储过程

1.1 存储过程的概述

1.2 存储过程的类型

1. 系统存储过程

2. 本地存储过程

3. 临时存储过程

4. 扩展存储过程

1.3 T-SQL创建存储过程

1.4 T-SQL执行存储过程

1.5 T-SQL查看存储过程

1.6 T-SQL修改存储过程

1.7 T-SQL删除存储过程

2、触发器

2.1 触发器的概述

2.2 触发器的类型

1.DML触发器

2.DDL 触发器

3.登录触发器

2.3 T-SQL创建触发器

1. 创建触发器的注意事项

2. DML触发器

3. DDL触发器

2.4 T-SQL查看触发器

2.5 T-SQL修改触发器

2.6 T-SQL禁用和启用触发器

2.7 T-SQL删除触发器


 T-SQL的语法约定

数据库的概念和操作-CSDN博客

1、存储过程

1.1 存储过程的概述

存储过程是一组在数据库系统中为了完成特定功能T-SQL语句的集合,经编译后独立存储在数据库中。当需要其功能时,只需要通过存储过程名并给出参数(如果存储过程有参数的情况)调用即可,且存储过程只在首次执行时进行编译,而不需要每次执行时重新编译,所以比单个T-SQL语句块的运行速度快。

存储过程是SQL Server中一个非常有用的工具。SQL Server支持存储过程和系统过程。存储过程是独立存在于表之外的数据对象。可以客户调用,也可以从另一个过程触发器调用参数可以被传递和返回出错代码也可以被检验到

1.2 存储过程的类型

1. 系统存储过程

系统存储过程是安装SQL Server 2014时自动创建的。系统存储过程能执行许多管理性和信息性活动(如获取数据库信息或者数据库对象的信息等)。系统过程主要存储在master数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息可以在其他数据库中被调用

2. 本地存储过程

本地存储过程也称为用户定义存储过程,是由用户自行创建并存储在用户数据库中的存储过程,一般所说的存储过程指的就是本地存储过程

3. 临时存储过程

临时存储过程可分为以下两种:

(1)本地临时存储过程

如果在创建存储过程时,其名称以#”号开头,则该存储过程将成为一个存储在tempdb数据库中的本地临时存储过程

(2)全局临时存储过程

如果在创建存储过程时,其名称以##”号开头,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程

不论创建的是本地临时存储过程还是全局临时存储过程,只要SQL Server 2014停止运行它们将不复存在

4. 扩展存储过程

扩展存储过程是用户可以使用外部程序语言(例如C语言)编写的存储过程。显而易见,扩展存储过程可以弥补SQL Server 2014的不足,并按需要自行扩展其功能。

扩展存储过程在使用和执行上与一般的存储过程完全相同,为了区别,扩展存储过程的名称通常以XP_开头。扩展存储过程是以动态链接库(DLL)的形式存在,能让SQL Server 2014动态地装载和执行。扩展存储过程一定要存储在系统数据库master中

1.3 T-SQL创建存储过程

CREATE {PROC|PROCEDURE} [schema_name.]procedure_name
[ @parameter data_type [=default] [OUT|OUTPUT|[READONLY]] [,...n] 
AS {[BEGIN] sql_statement [...n] [END]}

PROC|PROCEDURE:PROCEDURE可以简写为PROC

OUT|OUTPUT|READONLY:

OUT|OUTPUT输出型参数,类似于引用。

READONLY不能在过程的主体中修改参数参数类型为表值类型必须指定READONLY

1.4 T-SQL执行存储过程

[EXEC|EXECUTE] procedure_name [[@parameter=]{value|@variable[OUTPUT]}] [,...n]

EXEC|EXECUTE:EXECUTE可以简写为EXEC,如果存储过程是批处理中的第一条语句,那么可以省略EXECUTE关键字。

@parameter=:关键字参数,明确指定哪个实参传递给那个形参。

@variable OUTPUT:输出型参数,形参和实参的位置都要写OUTPUT

1.5 T-SQL查看存储过程

SP_HELPTEXT 'name' -- 命令语句
SP_HELP ['name'] -- 名称、架构名、类型、创建时间、参数
-- name省略时,显示所有数据库对象

1.6 T-SQL修改存储过程

与T-SQL创建存储过程相同,只是把CREATE 换成 ALTER

1.7 T-SQL删除存储过程

DROP {PROC|PROCEDURE} {[schema_name.]procedure_name} [,...n]

2、触发器

2.1 触发器的概述

触发器是一种特殊存储过程,它会在特定的事件或条件自动执行

优点:

1. 强制实现比CHECK约束更复杂数据的完整性

2. 实现自定义的错误信息提示。

3. 对数据库中的相关表实现级联修改和删除。

4. 可调用更多的存储过程

5. 禁止或回滚违反引用完整性(主键外键)的更改。

2.2 触发器的类型

1.DML触发器

DML触发器是当数据库服务器中发生数据操作语言(DML)事件时会自动执行的存储过程。DML事件包括在指定表或视图中修改数据的INSERT语句、UPDATE语句或DELETE语句。DML触发器可用于强制业务规则和数据完整性、查询其他表并包括复杂的T-SQL语句。

SQL Server 2014的DML触发器分为两类:

①AFTER触发器

在执行INSERT、UPDATE、MERGE或DELETE语句的操作之后执行AFTER触发器。 AFTER触发器只能在表上定义,可以为针对表的同一操作定义多个触发器。

②INSTEAD OF触发器

与AFTER触发器不同,INSTEAD OF触发器一般用来取代原来的操作,它是在数据变更之前触发的,它并不执行原来的操作语句(INSERT、UPDATE或DELETE),而去执行触发器本身所定义的操作。 INSTEAD OF触发器不仅可以定义在表上,也可以定义在视图上

2.DDL 触发器

DDL触发器在响应数据定义语言(DDL)语句时触发,DDL触发器一般用于数据库中执行管理任务。

当在执行触发DDL触发器的DDL语句后,DDL触发器才会触发。DDL触发器无法作为INSTEAD OF触发器使用。

3.登录触发器

登录触发器将为响应 LOGIN 事件而激发存储过程。

2.3 T-SQL创建触发器

1. 创建触发器的注意事项

(1) CREATE TRIGGER语句必须是批处理的第一条语句只能用于一个表或视图

(2) 创建触发器的权限默认为表的所有者不能将该权限转让给其他用户

(3) 虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建

(4) 虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临时表,不应引用系统表,而应使用系统架构视图。

(5) TRUNCATE TABLE 语句类似于没有WHERE字句的DELETE语句,但不会激发DELETE触发器

2. DML触发器
CREATE TRIGGER [schema_name.]trigger_name 
ON {table|view} 
{FOR|AFTER|INSTEAD OF}  -- FOR=AFTER
{[INSERT][,][UPDATE][,][DELETE]}
AS {sql_statement[ ,...n ] }

 ROLLBACK:是回滚,类似于撤销。

inserted表:表中insert的数据。

deleted表:表中delete的数据。update是新数据在inserted表,旧数据在deleted表。 

例1:静止修改course表

use teaching
go
create trigger unupdate_c
on course
after update
as
beginraiserror( '禁止修改course表',16,1)rollback
end

例2:触发器级联更新,更新course表的cno,sc表中的cno也随之改变。

use teaching
go
create trigger C_sc_UP
on course
after update
asif update(cno)begindeclare @cno1 char(4),@cno2 char(4)select @cno1 = cno from insertedselect @cno2 = cno from deletedupdate scset cno = @cno1where cno = @cno2end
go

例3:触发器的引用完整性(主键外键),向sc表中插入数据,判断数据是否在student和course中存在。

create trigger tr_sc on sc
for insert
asif not exists(select * from student where sno = (select sno from inserted)) ornot exists(select * from course where cno = (select cno from inserted))beginprint '您要插入的sno或cno有误'rollbackend
go
3. DDL触发器
CREATE TRIGGER [schema_name.]trigger_name 
ON {ALL SERVER|DATABASE} -- 当前服务器|当前数据库
{FOR|AFTER}  -- 没有INSTEAD OF
{event_type|event_group}[,...n]
AS {sql_statement[ ,...n ] }

event_type:如:CREATE_TABLE、ALTER_TABLE、DROP_TABLE……

event_group:如:DDL_TABLE_EVENTS(包含了CREATE_TABLE、ALTER_TABLE、DROP_TABLE)

2.4 T-SQL查看触发器

SP_HELPTEXT 'name' -- 命令语句
SP_HELP ['name'] -- 名称、架构名、类型、创建时间、参数
-- name省略时,显示所有数据库对象

2.5 T-SQL修改触发器

与T-SQL创建触发器相同,只是把CREATE 换成 ALTER

2.6 T-SQL禁用和启用触发器

禁用或启用DML触发器的T-SQL语句的语法格式如下:

ALTER TABLE table_name 
ENABLE|DISABLE TRIGGER [ALL|trigger_name[ ,...n ]]

禁用或启用DDL触发器的T-SQL语句的语法格式如下:

ENABLE|DISABLE TRIGGER {[schema_name.][ALL|trigger_name[ ,...n ]]}
ON {object_name|DATABASE|ALL SERVER}

例:禁用teaching数据库中的safety触发器

DISABLE TRIGGER safety on database

2.7 T-SQL删除触发器

DROP TRIGGER trigger_name

相关文章:

存储过程和触发器

目录 1、存储过程 1.1 存储过程的概述 1.2 存储过程的类型 1. 系统存储过程 2. 本地存储过程 3. 临时存储过程 4. 扩展存储过程 1.3 T-SQL创建存储过程 1.4 T-SQL执行存储过程 1.5 T-SQL查看存储过程 1.6 T-SQL修改存储过程 1.7 T-SQL删除存储过程 2、触发器 2.1 …...

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二)

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…...

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程,这个版本是我的第一版,使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假,训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…...

Spring Boot 和微服务:快速入门指南

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...

qt QPainter setViewport setWindow viewport window

使用qt版本5.15.2 引入viewport和window目的是用于实现QPainter画出来的内容随着窗体伸缩与不伸缩两种情况,以及让QPainter在widget上指定的区域(viewport)进行绘制/渲染(分别对应下方demo1,demo2,demo3)。 setViewpo…...

网络安全面试题汇总(个人经验)

1.谈一下SQL主从备份原理? 答:主将数据变更写入自己的二进制log,从主动去主那里去拉二进制log并写入自己的二进制log,从而自己数据库依据二进制log内容做相应变更。主写从读 2.linux系统中的计划任务crontab配置文件中的五个星星分别代表什么&#xff…...

【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第13章ospf路由协议】理论和实操

文章目录 选择题(10道)理论题(5道)实操题(5道) 【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第12章ospf路由协议】理论和实操 选择题(10道) 在OSPF协议中&#xff0c…...

FreeType 介绍及 C# 示例

FreeType 是一个开源的字体渲染引擎,用于将字体文件(如 TrueType、OpenType、Type 1 等)转换为位图或矢量图形。它广泛应用于操作系统、图形库、游戏引擎等领域,支持高质量的字体渲染和复杂的文本布局。 FreeType 的核心功能 字体…...

金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成

目录 一、⾃动化测试理论 二、自动化脚本 1、添加断言 1️⃣注册、登录 2️⃣认证、充值、开户、投资 2、可重复执行:清除测试数据脚本按指定顺序执行 1️⃣如何可以做到可重复执⾏? 2️⃣清除测试数据:连接数据库setup线程组 ①明确…...

Linux网络知识——路由表

路由表 1 定义与作用 Linux路由表是一个内核数据结构,用于描述Linux主机与其他网络设备之间的路径,以及如何将数据包从源地址路由到目标地址。路由表的主要作用是指导数据包在网络中的传输路径,确保数据包能够准确、高效地到达目标地址。 …...

浅谈云计算14 | 云存储技术

云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…...

AI 编程工具—Cursor进阶使用 阅读开源项目

AI 编程工具—Cursor进阶使用 阅读开源项目 首先我们打开一个最近很火的项目browser-use ,直接从github 上克隆即可 索引整个代码库 这里我们使用@Codebase 这个选项会索引这个代码库,然后我们再选上这个项目的README.md 文件开始提问 @Codebase @README.md 这个项目是用…...

使用 WPF 和 C# 将纹理应用于三角形

此示例展示了如何将纹理应用于三角形,以使场景比覆盖纯色的场景更逼真。以下是为三角形添加纹理的基本步骤。 创建一个MeshGeometry3D对象。像往常一样定义三角形的点和法线。通过向网格的TextureCoordinates集合添加值来设置三角形的纹理坐标。创建一个使用想要显示的纹理的 …...

Elasticsearch搜索引擎(二)

RestClient 基础 前言一、RestAPI1. 初始化 *RestClient*2. 创建索引库3. 删除索引库4. 判断索引库是否存在 二、RestClient操作文档1.新增文档2.查询文档3. 删除文档4. 修改文档5. 批量导入文档 前言 ES官方提供了各种不同语言的客户端用来操作ES,这些客户端的本质…...

unity学习17:unity里的旋转学习,欧拉角,四元数等

目录 1 三维空间里的旋转与欧拉角,四元数 1.1 欧拉角比较符合直观 1.2 四元数 1.3 下面是欧拉角和四元数的一些参考文章 2 关于旋转的这些知识点 2.1 使用euler欧拉角旋转 2.2 使用quaternion四元数,w,x,y,z 2.3 使用quaternion四元数,类 Vector3.zero 这种…...

走出实验室的人形机器人,将复刻ChatGPT之路?

1月7日,在2025年CES电子展现场,黄仁勋不仅展示了他全新的皮衣和采用Blackwell架构的RTX 50系列显卡,更进一步展现了他对于机器人技术领域,特别是人形机器人和通用机器人技术的笃信。黄仁勋认为机器人即将迎来ChatGPT般的突破&…...

如何使用wireshark 解密TLS-SSL报文

目录 前言 原理 操作 前言 现在网站都是https 或者 很多站点都支持 http2。这些站点为了保证数据的安全都通过TLS/SSL 加密过,用wireshark 并不能很好的去解析报文,我们就需要用wireshark去解密这些报文。我主要讲解下mac 在 chrome 怎么配置的&…...

电脑有两张网卡,如何实现同时访问外网和内网?

要是想让一台电脑用两张网卡,既能访问外网又能访问内网,那可以通过设置网络路由还有网卡的 IP 地址来达成。 检查一下网卡的连接 得保证电脑的两张网卡分别连到外网和内网的网络设备上,像路由器或者交换机啥的。 给网卡配上不一样的 IP 地…...

定义:除了Vue内置指令以外的其他 v-开头的指令(需要程序员自行扩展定义)作用:自己定义的指令, 可以封装一些 dom 操作, 扩展

1.自定义指令(directives) 1.用法 定义:除了Vue内置指令以外的其他 v-开头的指令(需要程序员自行扩展定义)作用:自己定义的指令, 可以封装一些 dom 操作, 扩展额外功能 语法: ① 局部注册 ●inserted:被绑…...

SpringBoot错误码国际化

先看测试效果: 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//# code命名规则:模…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...