<SQL> SQL instead of trigger 触发器

SQL SERVER Trigger 触发器 触发器【trigger】是一种特殊的存储过程,它在表的数据变化时发生作用。触发器可以维护数据完整性触发器的作用就是保证参照完整性和数据的一致性。 阅读详情
环境
  • Azure SQL Database
  • Visual Studio 2019
  • ASP NET CORE 2.2

写Trigger, 使用cursor遍历

CREATE TRIGGER [TriggerBeforeInsertUpdate]
ON [dbo].[ChineseCharacter]
INSTEAD OF INSERT, Update
AS
BEGIN
	SET NOCOUNT ON
	declare @t table([id] bigint not null);
	declare @insertedline int = 0;
	declare @id bigint;
	declare @oldid bigint;
	declare @data nvarchar(max);
	-- declare a cursor
	-- 定义为local避免出现已经定义
	DECLARE insert_cursor CURSOR LOCAL FOR 
	SELECT	ID, Data
		from inserted;
 
	-- open cursor and fetch first row into variables
	OPEN insert_cursor
	FETCH NEXT FROM insert_cursor 
			into @id, @data,
	
	-- 开始循环遍历
	-- check for a new row
	WHILE @@FETCH_STATUS=0
	BEGIN
		-- do complex operation here 
		select @oldid = ID from deleted where ID = @id;
	
		if @oldid is null 
		begin
			-- 说明执行的是插入
			set @insertedline  += 1;
			insert into @t values (@id);
		end
		else 
		begin
			-- 说明执行的是更新 
		end

		-- get next available row into variables
		FETCH NEXT FROM insert_cursor 
			into @id, @data,

	END

	close insert_cursor
	Deallocate insert_cursor
	
	-- 返回受影响的行数
   if @insertedline > 0
   	  select * from @t;
END

问题解决:

  1. 出现错误Database operation expected to affect 1 row(s) but actually affected 0 row(s)

insert最后没有返回受影响的行数
– 返回受影响的行数
select * from @t

  1. 提示Cursor已存在

为cursor添加LOCAL描述符
DECLARE insert_cursor CURSOR LOCAL FOR

关于Deleted和Inserted表
表InsertDeleteUpdate
Inserted插入列空修改前的列
Deleted空删除列修改后的列

所以我们可以根据Deleted表来判断是Insert还是update.

6.SQL Server DML触发器--INSTEAD OF触发器 本文摘自《锋利的SQL》:http://item.jd.com/10380652.html 在前面讨论的一直都是AFTER触发器。INSTEAD OF在处理约束前激发,可以在INSTEAD OF中使用其他语句来替代激发触发器的INSERT、UPDATE等语句。 可以为表或视图定义INSTEADOF触发器,但是,INSTEADOF触发器的主要优点是可以使不能更新的视图支持更新 阅读详情

相关推荐

SQL : INSTEAD OF触发器的工作过程

可以在表或视图上指定INSTEAD OF触发器。执行这种触发器就能够替代原始的触发动作。INSTEAD OF触发器扩展了视图更新的类型。对于每一种触发动作(INSERT、UPDATE或 DELETE),每一个表或视图只能有一个INSTEAD OF触发器。 INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。例如,通常不能在一个基于连接的视图上进行DELETE操作。然而,可以编写...

weixin_44523387的博客 2766

Database operation expected to affect 1 row(s) but actually affected 0 row(s).解决方案

SELECT changes(); 引发的异常:“Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException”(位于 Microsoft.EntityFrameworkCore.dll 中) “Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException”类型的异常在 Microsof...

程序员养成计划 1万+

SQL Server触发器实战避坑指南:After与Instead Of选型、事务控制与审计系统设计

触发器是SQL Server中实现数据一致性、审计日志和业务拦截的关键机制,其核心在于理解DML与DDL触发器的执行时序、事务上下文(如@@TRANCOUNT)及隐式事务行为。After触发器在约束校验后执行,适用于日志记录与通知;Instead Of触发器则在约束前接管,是唯一能绕过CHECK、DEFAULT、外键级联的‘数据越狱’手段。二者选型错误将直接导致超卖、日志丢失或递归崩溃。结合保存点(Savepoint)、集合操作替代游标、EVENTDATA()解析等工程实践,可构建高可用审计系统。本文聚焦生

clugcpne10995的博客 2062

Postgre The database operation was expected to affect 1 row(s), but actually affected 0 row

Postgre , The database operation was expected to affect 1 row(s), but actually affected 0 row

weixin_44997008的博客 1946

SQL-触发器(trigger)的详解以及代码演示

触发器是一种特殊的存储过程,但是触发器不存在输入和输出参数,所以不能被显式的去调用,而是与特定的表相关联,当表中的数据发生变化时,触发器被激活并执行其定义的SQL代码。触发器可以是行级触发器(针对每一行数据变化)或语句级触发器(针对整个SQL语句的变化),行级触发器允许对每一行单独处理,而语句级触发器则在整个操作完成后执行一次。这个查询将返回触发器的名称、父对象(表或视图)的名称、触发器的类型(如AFTER、INSTEAD OF)以及触发事件(如INSERT、UPDATE、DELETE)。

m0_67265654的博客 1160

Python抓取摄像头图像,进行AI识别(一)

本文介绍了如何用Python获取海康威视摄像头的图像并进行AI识别。主要内容包括:1)准备工作,包括摄像头IP设置和密码重置方法;2)使用Python的Requests库通过ISAPI接口获取实时图像;3)示例代码展示如何保存摄像头图像。整个过程为后续AI图像识别提供了基础,通过简单的Python代码即可实现专业监控设备的图像采集功能。

Hahafantuan的博客 1514

EFcore 保存出现并发被提前修改的报错

EFcore 保存出现并发被提前修改的报错 提示语言Database operation expected to affect 1 row(s) but actually affected 0 row(s). public static void EFNewExecute(Action<DbContext> executeAction, DbContext context, bool isCheckConcurrent = false) { ...

yu240956419的博客 1941

华为开发岗暑期实习笔试(2025年4月16日)

第一题怀疑测试样例不完整,贪心法不应该能够解决该题。第二题使用0-1BFS解决单源最短路径的问题,往往搭配双端队列实现。第三题是运用动态规划解决最大不重叠子区间个数的问题,难点在于满足3重判断规则,所需数据结构及相关操作较多。

csy031117的博客 3661

Database operation expected to affect 1 row(s) but actually affected 0 row(s) entity framework core

记一次很奇怪的报错,这种错误很常见,但是新增提示的还是比较少见,最后竟然是因为红色框柱的影响的 、

songjuntao8的专栏 4629

temu登录接口逆向分析(含Py纯算)

【代码】temu登录接口逆向分析(含Py纯算)

数据精灵喵 1944

螺丝锁付系统软件设计 C# Winform

视觉螺丝锁付系统软件设计 C# Winform ,这是其中通信子模块设计

weixin_42522973的博客 340

The database operation was expected to affect 1 row(s), but actually affected 0 row(s); 解决乐观并发

我的开源项目修改的类的源码,源码地址:**https://github.com/TerraMours/TerraMours_Gpt_Api/blob/main/TerraMours/TerraMours/Framework/Infrastructure/EFCore/FrameworkDbContext.cs。在这种情况下,数据不会丢失。在 Jane 单击“保存”之前,John 访问了相同页面,并将开始日期字段从 2007/1/9 更改为 2013/1/9。跟踪用户已修改的属性,并仅更新数据库中相应的列。

qq_34388017的博客 1733

ShardingSphere-JDBC 关键字问题

这里得到的提示就是,假设一个老库一堆表,只对个别表进行分表。引入sharding后虽然指定了分表的bindingTables,其余的走default-data-source就是默认不分表的。但是sharding会接管数据源,老表用默认的mybatis正常,sharding可能会报错。preciseAlgorithmClassName对应的是类名,注意yaml的缩进。这不是常见的没有配置sharding数据源导致empty的错误。使用sharding的时候,遇到了两个问题。...

bohu83的博客 4996

SQL -- 触发器(详细)

文章目录一 、概述1-1 存储过程基本概念1-2 存储过程的类型二、语法 T-SQL1-1 创建存储过程1-2 查看存储过程1-3 修改存储过程1-4 删除存储过程1-5 存储过程命名规则1-6 创建举例用的数据库 一 、概述 1-1 存储过程基本概念 什么是存储过程 存储过程是事先编好的、存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。 存储过程的优点 1. 减少网络流量 存储过程是数据库服务器端完成的,只向客户端返回执行的结果。 实现相同功能时,不使用存

M1234uy的博客 4万+

手机拍视频就能训练机器人?SpatialLM开源模型实战指南(附HuggingFace部署教程)

本文详细介绍了如何利用开源模型SpatialLM通过手机视频训练机器人理解3D空间结构。从HuggingFace部署、视频预处理到模型推理和结果可视化,提供完整的实战指南,特别适合具身智能领域的开发者快速上手。

2y3u4i5o6p的博客 787

PCIE的MSI中断处理机制与优化策略

PCIe设备的。

xiaoheshang_123的博客 516

SQL Server 触发器( trigger ) ------- 用例详解( 你需要举一反三的触发器实用方法都在这了 )

trigger 导航专用第一部分1. 概述第二部分 实现1. 触发器的创建① insert 触发器的创建② delete 触发器的创建③ update 触发器的创建2. 多表级联插入触发器3. 多表级联删除触发器4. 多表级联修改触发器5. DDL 触发器6. 使用系统存储过程查看触发器7. 修改触发器① 改名② 改质8. 禁用启用触发器9. 删除触发器 第一部分 1. 概述 触发器的特点 触发器不能被直接调用执行,它只能由事件触发而自动执行。 触发器是自动执行的,当用户对表中数据作了某些操作之后立即被触

嘟嘟的博客 4万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议

sqlserver触发器详解(一篇让你打通触发器的文章):sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议

是谢添啊 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SQL Server 创建触发器(trigger)

触发器简介: 触发器是一种特殊的存储过程,它的执行不是由程序调用,也不是手动执行,而是由事件来触发。触发器是当对某一个表进行操作。例如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。 触发器分类: 1、DML(数据操纵语言 Data Manipulation Language)触发器:是指触发器在数据库中发生 DML 事件时将启用。DML事件...

weixin_34343308的博客 4098

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

实验七 触发器

一.实验目的 (1)理解触发器的用途、类型和工作原理。 (2)掌握利用T-SQL语句创建和维护触发器的方法。 (3)掌握利用SQL Server Management Studio创建、维护触发器的方法。 二.实验内容 创建AFTER触发器 (1)创建一个在插入时触发的触发器sc_insert,当向SC表插入数据时,须确保插入的学号已在Student表中存在,并且还须确保插入的课程号在Course表中存在;若不存在,则给出相应的提示信息,并取消插入操作,提示信息要求指明插入信息是学号不满足条件还是课程号

Lilianach的博客 1万+

SQL之trigger触发器

触发器是一种数据库对象,一般与一个表相关联,当对该表做出某种修改操作(INSERT、DELETE、UPDATE)时,它会自动地予以执行。触发器可以查询其它表,并可以包含复杂的SQL(或Transact-SQL)语句。 触发器经常用于加强数据的完整性约束和业务规则等。 由于每个厂商对trigger的实现不同,这里以SQL Server为例。 特点 1)它与表紧密相连,可以看作表定义的一部分 2)它不能通过名称被直接调用,更不允许带参数,而是当用户对表中的数据进行修改时,自动执行 3)它可以用于SQL Serv

学习永无止境 5807

instead of触发器

触发器是类似于存储程序的数据库对象,它响应数据库环境下的某个请求。SQL Sever 2005包含3个触发器对象:AFTER,数据定义语言 (DDL)和INSTEAD-OF。 AFTER触发器是存储程序,它发生于数据操作语句作用之后,例如删除语句等。DDL是SQL Server 2005的新触发器,允许响应数据库引擎中对象定义水平事件(例如:DROP TABLE语句)。INSTEAD-OF触发

stone的专栏 1385

Oracle PL / SQL – INSTEAD OF触发器示例

本文向您展示如何使用INSTEAD OF TRIGGER进行更新 非版本视图 非版本视图的嵌套表列 此INSTEAD OF触发器提供了一种修改views的方法,该views无法直接通过DML语句(如INSERT,UPDATE和DELETE)进行修改 INSTEAD OF触发器是 始终是行级触发器。 可以读取旧值和新值,但不能更改它们。 不能是有条件的。 意味着我...

一名可爱的技术搬运工 700

oracle instead of trigger

A view presents the output of a query as a table. If you want to change a view as you would change a table, you must create INSTEAD OFtriggers. Instead of changing the view, they change the underlyi

zs12344444的专栏 618

sql server update触发器_SQL Server 触发器

T-SQL 触发器触发器分为BEFORE触发器*(SQL Server不支持,Oracle支持)在事件发生时触发。AFTER触发器是 SQLServer生成的最初用于自动相应数据修改的机制。在 SQLServer200以前的版本中 AFTER触发器是唯一的触发器,因此不用指明 AFTER,也可以用 FOR代替,该种触发器的行为是在事件之后执行。SQLServer2000中新增了 INST...

weixin_39835792的博客 3850
上一篇: <UWP> Windows Device Portal以及ETW调试信息的使用
下一篇: <Csharp> 判断UNICODE字符是否属于汉字
_Lulixue_
博客等级 码龄16年 45粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值