首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >MS SQL 2005更新UPDATE触发器更新其他行而不是已更新行

MS SQL 2005更新UPDATE触发器更新其他行而不是已更新行
EN

Stack Overflow用户
提问于 2010-10-18 13:37:27
回答 2查看 7.4K关注 0票数 0

作为一个几乎没有经验的用户,我必须在一个表上创建一个触发器(或者找到另一个解决方案)。需要完成的是,当表中另一行的ESB列的值更改为“1”时,必须将该列设置为“0”。

我的意图是使用AFTER UPDATE触发器来完成此操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TRIGGER [TR_PHOTO_UPD]
   ON    [SOA].[dbo].[photos_TEST]
   AFTER  UPDATE
AS 

DECLARE @ID  VARCHAR(10)
DECLARE @ESB  VARCHAR(1)

SELECT @ID  = (SELECT TOP(1) ID 
      FROM SOA.dbo.photos_TEST 
               WHERE esb = 'Q' 
               ORDER BY ARRIVALDATETIME ASC)
SELECT @ESB (SELECT esb FROM INSERTED)


IF @ESB = '1'
UPDATE SOA.dbo.photos_TEST SET esb = '0' WHERE ID = @I

您可能知道,这是不起作用的,下一个触发器定义也不起作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TRIGGER [TR_PHOTO_UPD]
   ON    [SOA].[dbo].[photos_TEST]
   AFTER  UPDATE
AS 

DECLARE @ID  VARCHAR(10)
DECLARE @ESB  VARCHAR(1)

SELECT @ID  = (SELECT TOP(1) ID 
      FROM SOA.dbo.photos_TEST 
               WHERE esb = 'Q' 
               ORDER BY ARRIVALDATETIME ASC)
SELECT @ESB (SELECT esb FROM INSERTED)


    IF @ESB = '1'
    BEGIN
  UPDATE SOA.dbo.photos_TEST 
  SET esb = '0'
  WHERE id = (SELECT TOP(1) ID 
       FROM SOA.dbo.photos_TEST 
       WHERE esb = 'Q' 
       ORDER BY ARRIVALDATETIME ASC)
    END

经过几个小时的谷歌搜索和尝试,我还没有找到为什么行没有更新为'0‘。我怀疑AFTER UPDATE触发器中的UPDATE是它不工作的原因。有没有人有什么建议或者更好的解决方案?

干杯,

彼得

EN

回答 2

Stack Overflow用户

发布于 2010-10-18 13:53:12

在处理多个更新时,这两种方法都不起作用。

为什么你甚至需要在个案的基础上这样做呢?你就不能直接在表上运行一个更新吗?

也许是类似这样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
If Update(ESB)
    begin

       Update a
       Set AnotherColumn = 0
       From YourTable a
       Join inserted ins on a.Id = ins.Id
       Where ins.ESB = 1

    end

这将检查更新的是否是ESB列。如果是,则运行update语句将AnotherColumn设置为0,其中ESB值为1

我想这对你应该很管用

票数 1
EN

Stack Overflow用户

发布于 2010-10-19 08:11:20

多亏了巴里的帮助,如果最终敲定了扳机;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    CREATE TRIGGER TR_PHOTO_AU
   ON          SOA.dbo.photos
   AFTER     UPDATE
AS 

DECLARE @MAXCONC INT  -- Maximum concurrent processes
DECLARE @CONC INT     -- Actual concurrent processes

SET @MAXCONC = 1      -- 1 concurrent process

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON

-- If column esb is involved in the update, does not necessarily mean
-- that the column itself is updated
If ( Update(ESB) )
BEGIN
    -- If column esb has been changed to 1
    IF ((SELECT esb FROM INSERTED) = '1')
    BEGIN
        -- count the number of (imminent) active processes
        SET @CONC = (SELECT COUNT(*) 
                  FROM SOA.dbo.photos pc
                  WHERE pc.esb in ('0','R'))

        -- if maximum has not been reached
        IF NOT ( @CONC >= @MAXCONC )
        BEGIN
            -- set additional rows esb to '0' to match @MAXCONC
               UPDATE TOP(@MAXCONC-@CONC) p2
               SET p2.esb = '0'
            FROM ( SELECT TOP(@MAXCONC-@CONC) p1.esb 
                   FROM SOA.dbo.photos  p1
                   WHERE  p1.esb = 'Q'
                   ORDER BY p1.arrivaldatetime ASC 

            ) p2

        END
    END
END
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3959709

复制
相关文章
Pymongo:update更新数据
导读 Pymongo update用法。 1、现在集合里有3条数据 import pymongo mongo_client = pymongo.MongoClient( host="192.168.0.112", port=27017, username="admin", password="123456" ) mongo_db = mongo_client["db1"] # 读取数据 res = mongo_db.chat.find() for i in res: print(i) #
新码农
2020/12/21
7.7K0
Pymongo:update更新数据
代码已更新
前端:vue入门 vue开发小程序 等 后端: java入门 springboot入门等 服务器:mysql入门 服务器简单指令 云服务器运行项目 python:推荐不温卜火 一定要看哦 一些插件的使用等
代码哈士奇
2021/02/04
3300
代码已更新
SQL"已更新或者删除的行值要么不能使该行成为唯一行,要么改变了多个行(X行)“解决办法
  这种问题大多是由于没有主键(PK)导致同一张表中存在若干条相同的数据。DBMS存储时,只为其存储一条数据,因为DBMS底层做了优化,以减少数据冗余。所以删除或更新一条重复数据就牵一发而动全身。
孙晨c
2019/09/10
3.6K0
SQL"已更新或者删除的行值要么不能使该行成为唯一行,要么改变了多个行(X行)“解决办法
AL_lolimeow 更新,已更新图库上传
已经更新了图库上传接口。原来的 sm.ms 不能用了,已经替换成 www.alapi.net 提供的接口
Alone88
2020/06/11
3150
Mysql update多表联合更新
下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法
周小董
2019/08/14
3.6K0
windows update 更新 卡在100%
更新补丁在100%卡住了,迫不得已强制重启了,重启后,又从头完整走了一遍死循环过程:到30%的时候自动重启了一次,然后继续35%到100%,在100%卡着了,等了半个小时没变化,我还是从winpe卸载补丁吧
Windows技术交流
2022/08/26
3K0
批量更新数据小心SQL触发器的陷阱
批量更新数据时候,Inserted和Deleted临时表也是批量的,但触发器只会调用执行一次!两个概念千万不要弄混淆!
跟着阿笨一起玩NET
2018/09/19
1.2K0
【数据库报错(未删除任何行,未更新任何行)】
首先查看定义的表格数据类型有无问题,点击表格编辑前100行 如何更改编辑行数:更改编辑行数 这里的允许NULL值为通过输入端输入后,写进数据库是否包含空值 例如,输入端通过注册输入注册名后,若允许NULL值未勾选,则写进表格的为用户名+数据类型除了用户名所占字节剩余用空格进行填充(写入表格中的数据为用户名+若干空格) 若允许NULL值勾选了,则写进表格的即为刚刚进行注册的用户名,其后没有多余空格
magize
2023/07/11
3870
【数据库报错(未删除任何行,未更新任何行)】
update的多表更新的试验
        受access的sql语句的影响,一直习惯的是用 update (连接表) set ... where ...,坏处是写起来很复杂,别名一大堆,事后自己都看不懂。 发现还其实可以直接就可以对多表更新 UPDATE a SET a.t2 = b.t2 FROM x1 a, x2 b WHERE a.t1 = b.t1 作一些试验: x1表:     t1    t2    f_id     a    1     b    2     c    3     a    4     b    5  
用户1075292
2018/01/23
9800
带你不到80行代码搞定Flutter热更新
Flutter作为跨平台方案,相信最近很多小伙伴都已经开始接入了,我们的接入参考官方wiki,在成功接入之后,我们为了在CI构建中不依赖fluter环境,采用了调试模式使用源码的方式,打包的时候使用aar的方式,这样做的好处是,既能够保留开发期间的可调试行,也能保障构建环境不依赖Flutter环境。为此,我们团队双端各写了一个脚本,来切换接入模式,且自动将Flutter产物提提取并推送到原生工程以便打包。成功上线几个业务之后,我们遇到flutter的线上问题,大家可能和我当时的感受一样,没有一个比较好的开源工具来对Flutter进行热修复,在网上搜一下,如这篇,大多数表示只讲解原理,看原理理论上是行得通的,但是遗憾的是并没有具体实现过程,于是我们决定立足原理,来探索在Android上怎么实现Flutter页面的热更新,以下是热更新实现后的效果:
老码小张
2019/11/01
26.2K42
带你不到80行代码搞定Flutter热更新
vCenter Server更新- Update via shell
镜像文件在6-8G左右,整体比较大,下载后可通过md5sum或sha1sum对比校验和是否和官网一致,这一步确保文件的完整性与一致性。
RokasYang
2022/05/22
1.7K0
vCenter Server更新- Update via shell
SVN提示update更新成功,但是本地文件却没有更新
问题描述:将仓库的最新版本代码check out到本地后,然后最某个文件做了修改,保存后想通过svn的update来重新得到最新的版本,发现失效。
全栈程序员站长
2022/07/07
2K0
SVN提示update更新成功,但是本地文件却没有更新
GridView行编辑、更新、取消、删除事件使用方法
注意:当启用编辑button时,点击编辑button后会使一整行都切换成文本框。为了是一行中的一部分是文本框,须要把以整行的全部列都转换成模板,然后删掉编辑模板中的代码。这样就能使你想编辑的列转换成文本框。
全栈程序员站长
2022/07/12
1.5K0
MySQL SQL更新锁定
版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。
Leshami
2018/12/19
2.5K0
SQL更新语句
如果,你想更新数据库中其中某一条数据。那么你需要使用UPDATE语句。基本的UPDATE语句如下。
zy010101
2020/12/08
9920
update自更新字段添加新字段是否会更新旧数据
验证:一张具备自更新字段的表,如果新增一个字段,原表数据的update_time字段是否会更新?
薄刀刀
2022/04/29
1.1K0
一行代码实现蒲公英市场APP检查更新
其实,要实现这个功能也比较简单,第一步,我先是判断是否有读写外部存储的权限,因为下载 apk 一般来说是要下载到手机的 SD 卡上;如果有权限,那就调用蒲公英的更新检测接口,这个接口至少需要两个参数,apiKey 和 appKey,这两个值我们在蒲公英的 APP 信息中可以查到,我的想法是在清单文件中,让用户去设置这两个值,然后我动态取出来,这样就解决了这两个参数值传递的问题;接口请求成功后,会返回 buildVersionNo这个字段,然后通过这个返回字段与本地的 versionCode 去比对,如果比本地的大,说明就有新版本,然后弹出对话框,提示用户更新,当用户点击“更新”时,就去下载对应的版本即可,下载完成后调用安装程序,这样基本的更新思路就出来了。
程序员飞飞
2020/03/02
1K0
mysql 多表查询和更新_MySQL update select 多表关联查询更新
在遇到需要update设置的参数来自从其他表select出的结果时,需要把update和select结合使用,不同数据库支持的形式不一样,在mysql中如下:
全栈程序员站长
2022/09/01
3.9K0
MySQL_插入更新 ON DUPLICATE KEY UPDATE
1、效率太差,每次执行都要执行2个sql 2、高并发的情况下数据会出问题,不能保证原子性
全栈程序员站长
2022/08/09
6450
点击加载更多

相似问题

SQL -删除update触发器中已更新的行

30

SQL触发器正在更新随机行,而不是连接的行

21

SQL Server 2005不会更新行

10

更新大量行- SQL Server 2005

10

根据其他行( sql )更新行

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文