【问题标题】:SQL Server trigger before insert or update depend on value插入或更新之前的 SQL Server 触发器取决于值
【发布时间】:2015-06-30 13:26:28
【问题描述】:

是否可以检查列值,然后在插入或更新之前更改其他记录值?

我会解释更多:我有如下表格:

CREATE DATABASE pics
GO

CREATE TABLE tel
(
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [name] [nvarchar](10) NULL,
    [number] [nvarchar](10) NULL,
    [active] [bit]                                  
)

我需要知道当前的电话号码,如果当前记录(插入或更新)在active 列中为真,其他记录active 列设置为假,

我的意思是当

  1. 插入或更新记录并
  2. 当前记录活动值为 True

然后将所有其他记录 active 列设置为 False。

有可能吗?

【问题讨论】:

  • 您无法创建before insert 触发器,但您可以创建instead of insert 触发器并在实际插入此触发器之前做任何您想做的事情。
  • 什么是当前记录——你如何定义它? 每个语句触发一次 SQL Server 触发器 - 如果 INSERTUPDATE 影响多行 - 这些行中的哪一行是您的 当前 行???跨度>
  • 如果你能定义你的目标的逻辑,剩下的就是简单的SQL。

标签: sql-server database sql-server-2008 triggers


【解决方案1】:

请关注SQL trigger

select * from tel
/*
insert into tel select 'kodyaz','123456789',1
insert into tel select 'eralper','45688',1
insert into tel select 'sql','7955528',1
insert into tel values ('SQLServer','0152222',1),('SQL2016','20162016',1)
*/
go
create trigger tr_tel_active on tel after update, insert
as
begin
    if exists (
        select * from inserted where active = 1
    )
    update tel 
    set active = 0
    where 
        id not in (
            select id from inserted where active = 1
        ) and active = 1
end
go

请注意,开发人员最常犯的关于触发器的错误是我们总是认为每个插入或更新语句只对一条记录有效。这不是真的。 例如,我的一个插入语句同时创建了 2 行。

这个触发器的作用是:如果至少有一个活动行被插入或更新,它将所有活动行更新为非活动语句

请在部署到生产环境之前进行测试

【讨论】:

  • 它工作完美,我必须检查并理解你写的内容,你能指导我一个简单的触发器教程,
  • 在触发器执行中,您有两个表“插入”和“删除”,它们反映了行的新旧版本。如果您正在更新一行,则插入和删除的表都有数据。否则在使用插入或删除命令时,上述表格之一为空。您可以使用这些表数据构建您的逻辑。详情请参考链接kodyaz.com/articles/sql-trigger-example-in-sql-server-2008.aspx。这很重要,始终创建基于集合的逻辑。可以存储单个值的变量非常危险,会导致数据完整性错误
【解决方案2】:

我不确定我是否理解你,但如果你想在使用触发器将某些记录插入表之前做一些检查,那么你可以使用而不是触发器类型。

行为和语法类似于后触发器,主要区别在于您可以说不是插入此行 => 执行此操作...,而后触发器逻辑是插入行=> 执行此...。

【讨论】:

  • 感谢@MiroslavStojakovic 的回复,我需要先检查,如果活动为真,将其他记录活动更改为假,否则,插入或更新
猜你喜欢
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多