Notes
  • 简介
  • Linux
    • Ubuntu
      • Ubuntu 20.04 ARM64 修改PAGE_SIZE 64k
    • Samba
      • CentOS7安装Samba
      • 简单案例
      • 审计
      • 相关命令
    • Systemd
    • FPM 打包 nginx rpm 包
    • rpm 打包-从二进制文件进行打包
    • Centos7 重置密码
    • CentOS7搭建kvm并创建虚拟机
    • CentOS7-KVM 嵌套虚拟化
    • CentOS7 KVM GPU 穿透
    • Bonding
    • CentOS7 发送邮件
    • CentOS7 安装 OpenVPN
    • Linux 多线路由策略
    • Webmin 安装
    • NoVNC 安装
    • SRS-RTMP 服务部署
    • CentOS7 安装 MongoDB
    • confluence 安装
    • jira 安装
    • crowd 安装
    • ScriptRunner For Jira
    • ScriptRunner For Confluence
    • Ubuntu VNC
    • Ubuntu18.04-VNC 安装
    • deb 打包
    • iptables
    • debian 保持软件包一致
    • Ubuntu18.04 编译安装 grpc
    • CentOS7 安装 odoo13
    • Pacemaker 入门
    • Firewalld Rich Language
    • PHP Xdebug
    • CentOS7.3 编译安装 Python3.6
    • 葫芦儿打包
    • CentOS7 安装 Tomcat8
    • CentOS7 安装 JDK
    • GuacamoleServer 编译安装
    • FreeBSD7.0安装AMP
    • CentOS7 换源
    • deb下载并离线安装
    • pip下载并离线安装
  • Network
    • 案例一
  • AI
    • 微调Qwen2.5
    • Qwen2.5 VL AWQ量化
    • qwen2.5 填充权重
  • JavaScript
  • Zabbix
    • CentOS7 安装 Zabbix4.0 LTS
    • Zabbix 加密连接
    • Zabbix 主动和被动模式
    • Zabbix 配置邮件报警
    • Zabbix 监控 MySQL
  • 数据库
    • MySQL
      • CentOS7 Install MySQL5.7
      • MySql 主从配置
      • CentOS7 安装 Percona XtraDB Cluster
      • MySql 压力测试-sysbench
      • MariaDB Galera Cluster
      • 备份脚本
    • MongoDB
      • 启用账号密码登录
      • 备份脚本
  • Nginx
    • CentOS7 安装 Nginx
    • Nginx 配置
    • nginx-http-flv-module
    • Nginx-WebDAV
  • Docker
    • CentOS7 安装 Docker
    • Dockerfile
    • DockerSwarm 集群
    • Docker 安装 guacamole
  • Python
    • 虚拟环境
  • Windows
    • Windows 问题集合
    • 迅雷自动安装 Chrome 插件
    • RDP 注册表
    • Rdp File Setting
    • 本地组策略对象(LGPO)工具
    • 禁用应用联网
    • SQL Server 问题处理
    • SQL Server Trigger
    • NSIS 脚本
    • 使用QEMU运行ARM64 CentOS7
    • DOS 脚本
    • Windows 11 设置旧版右键菜单
    • 远程桌面二次验证
  • Apple
    • AppStore 应用开发及上架
    • Apple 打包 Golang WebDav 制作 pkg 安装包
  • Android
    • Android Studio创建具有root权限的虚拟机
    • Android读写挂载system
    • Android安卓CA至系统
  • 证书
    • 证书名称(主题)
    • 证书扩展
    • SSL 自签
    • 免费 https 证书申请
  • 树莓派
    • 树莓派系统烧录及系统打包制作
    • 树莓派基础操作
    • 树莓派安装 NextCloud
    • 树莓派安装 LNMP
    • 树莓派自定义开机界面和登录提示
    • 树莓派安装 HomeAssistant
    • HomeAssistant 配置
    • 树莓派自动挂载 U 盘
    • 树莓派安装 vsftpd
    • vsftpd 配置文件详解
  • ceph
    • ceph-deploy 部署 ceph nautilus 版本
    • ceph dashboard
  • OpenStack
    • OpenStack VM 配置 Virtual IP
    • OpenStack Glance 对接 Ceph RBD 存储
    • OpenStack Cinder Volumes 对接 Ceph RBD 存储
    • OpenStack 集群搭建
    • OpenStack Rocky 单节点部署
    • OpenStack Rocky 集群部署
    • OpenStack CentOS6 镜像制作
    • OpenStack-Ubuntu 镜像制作
    • Openstack-Windows 镜像制作
    • OpenStack-RBD 导入镜像
    • OpenStack-Rocky 灾备
    • rbd-mirror
  • FFmpeg
    • CentOS7 静态编译FFmpeg
    • MacOS10.12静态编译FFmpeg
    • CentOS7 Arm64静态编译FFmpeg
    • 使用NVIDIA显卡
    • 脚本
  • Other
    • 华为一碰传标签制作
    • 常用软件
    • wireguard
由 GitBook 提供支持
在本页
  • 语法
  • INSERTED 表和 DELETED 表
  • 示例
  1. Windows

SQL Server Trigger

语法

  • 创建或修改触发器

    -- 表或视图的INSERT、UPDATE或DELETE语句的触发器(DML触发器)
    
    { CREATE | ALTER } TRIGGER [ schema_name . ]trigger_name
    -- schema_name: DML 触发器所属架构的名称,一般不使用
    -- trigger_name: 触发器的名称。 一般由字母、数字、下划线构成,长度128字符以内
    ON { table | view }
    -- table: 表触发器,填写数据库表名
    -- view: 视图触发器,填写视图名
    [ WITH <dml_trigger_option> [ ,...n ] ]
    -- dml_trigger_option: 触发器高级选项,例:ENCRYPTION,加密触发器语句
    { FOR | AFTER | INSTEAD OF }
    -- FOR: 后触发,仅当触发 SQL 语句中指定的所有操作都已成功启动时,DML 触发器才触发。 所有引用级联操作和约束检查也必须在此触发器触发前成功启动。
    -- AFTER: 与FOR同义,但无法对视图定义 AFTER 触发器
    -- INSTEAD OF: 替代触发器,用来代替通常的触发动作,系统不是直接对表执行这些操作,而是把操作内容交给触发器,因为INSTEAD OF 触发器的动作要早于表的约束处理。每个INSERT、UPDATE 或 DELETE 语句只能有一个 INSTEAD OF 触发器
    { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
    -- INSERT: 插入时触发
    -- UPDATE: 更新时触发
    -- DELETE: 删除时触发
    [ WITH APPEND ]
    [ NOT FOR REPLICATION ]
    -- NOT FOR REPLICATION: 当复制进程更改触发器所涉及的表时,不要执行该触发器
    AS
    -- 触发语句,触发器可以包含任意数量和类型的 Transact-SQL 语句
  • 禁用触发器

    ALTER TABLE tabla_name DISABLE TRIGGER trigger_name
    -- tabla_name: 数据库表名
    -- trigger_name: 触发器名
  • 删除触发器

    DROP TRIGGER trigger_name
    -- trigger_name: 触发器名

INSERTED 表和 DELETED 表

Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

SQL Server 触发器有三种执行时机:After、For、Instead of

Instead Of 触发器与 For 和 After 触发器的工作流程是不一样。

For 和 After 触发器是在 SQLSERVER 服务器接到执行 SQL 语句请求之后,先建立 Inserted 和 Updated 临时表,然后在更改物理表上的数据,最后才激活触发器程序。

Instead Of 触发器在 SQLSERVER 服务器接到执行 SQL 语句请求,建立 Inserted 和 Updated 临时表后就激活了 Instead Of 触发器程序,至于 SQL 语句的请求如何操作数据就不在管了,把执行权全权叫给了 Instead Of 触发器。

For 和 After 触发器工作流程图

示例

用户表(User)

id

用户编号,主键

user_name

用户名

phone

电话

书籍信息(BookInfo)

id

书籍编号,主键

book_name

书籍名

price

单价

订单(Order)

id

订单编号,主键

user_id

用户ID

book_id

书籍ID

number

数量

price

总价

-- 创建表
IF EXISTS(SELECT Name FROM Sysobjects WHERE Name = 'User')
DROP TABLE [User]
GO

CREATE TABLE [User](
[id] int IDENTITY(100,1) PRIMARY KEY ,
[user_name] nvarchar(10) not null,
[phone] nvarchar(20)
)

IF EXISTS(SELECT Name FROM Sysobjects WHERE Name = 'BookInfo')
DROP TABLE [BookInfo]
GO

CREATE TABLE [BookInfo](
[id] int IDENTITY(100,1) PRIMARY KEY ,
[book_name] nvarchar(100) not null,
[price] decimal(20,2) not null
)

IF EXISTS(SELECT Name FROM Sysobjects WHERE Name = 'Order')
DROP TABLE [Order]
GO

CREATE TABLE [Order](
[id] int IDENTITY(100,1) PRIMARY KEY ,
[user_id] int not null,
[book_id] int not null,
[number] int not null,
[price] decimal(20,2)
)
-- 添加初始化语句
SET IDENTITY_INSERT [User] ON
INSERT INTO [User]([id],[user_name],[phone]) VALUES(100,'周卓浩','15782825513'),(101,'张悌斯','18269893952'),(102,'孙来笙','15907734953'),(103,'岳列洋','18042932995')
SET IDENTITY_INSERT [User] OFF

SET IDENTITY_INSERT [BookInfo] ON
INSERT INTO [BookInfo]([id],[book_name],[price]) VALUES(100,'Python编程 从入门到实践','65.00'),(101,'征服:如何赢得客户','52.20'),(102,'图解急救知识百科','75.80'),(103,'货币战争4 :战国时代','45.50')
SET IDENTITY_INSERT [BookInfo] OFF

-- 查询订单信息
SELECT
	[Order].[id] '订单ID',
	[User].[user_name] '用户名',
	[BookInfo].[book_name] '书籍名称',
	[BookInfo].[price] '单价',
	[Order].[number] '数量',
  [Order].[price] '总价'
FROM
	[Order]
	LEFT JOIN [User] ON [Order].[user_id] = [User].[id]
	LEFT JOIN [BookInfo] ON [Order].[book_id] = [BookInfo].[id]
  • 在 Order 表创建触发器update_order_price_trigger,用于计算正确总价

    尽量不要使用游标,游标性能差

    例 1:使用游标

    CREATE TRIGGER update_order_price_trigger ON [Order]
    FOR INSERT,UPDATE
    AS
    BEGIN
      DECLARE @id1 INT
      -- 定义游标
    DECLARE cursor1 CURSOR FOR
        SELECT [id] FROM [inserted]
      -- 打开游标
      OPEN cursor1
      -- 获取第一行数据
      FETCH NEXT  FROM cursor1 INTO @id1
      -- 通过判断@@FETCH_STATUS进行循环
      WHILE @@FETCH_STATUS = 0
      BEGIN
        UPDATE [Order]
    		SET [Order].[price] = [Order].[number] * [BookInfo].[Price]
        FROM [Order]
        LEFT JOIN [BookInfo] ON [Order].[book_id] = [BookInfo].[id]
        WHERE [Order].[id] =@id1
    		-- 获取下一行数据
        FETCH NEXT FROM cursor1 INTO @id1
      END
      CLOSE cursor1
      DEALLOCATE cursor1
    END

    例 2:不使用游标

    CREATE TRIGGER update_order_price_trigger ON [Order]
    FOR INSERT,UPDATE
    AS
    BEGIN
      UPDATE [Order] SET [Order].[price] = [Order].[number] * [BookInfo].[Price]
      FROM [inserted]
    	LEFT JOIN [Order] ON [inserted].[id] = [Order].[id]
    	LEFT JOIN [BookInfo] ON [Order].[book_id] = [BookInfo].[id]
    END
上一页SQL Server 问题处理下一页NSIS 脚本

最后更新于3年前

img
img
image-20200516173959725
image-20200516181851819