当使用特定值更新多个列时,在 VIEW 上使用触发器执行存储过程

Posted

技术标签:

【中文标题】当使用特定值更新多个列时,在 VIEW 上使用触发器执行存储过程【英文标题】:Execute Stored Procedure using Trigger on VIEW when multiple columns are updated with specific values 【发布时间】:2019-08-23 12:52:04 【问题描述】:

我有一个 VIEW(在 SQL SERVER 中),其中包含以下列:

itemID[vachar(50)]|itemStatus [vachar(20)]|itemCode[vachar(20)]|itemTime[varchar(5)]

itemID 列包含不变的 id 值。然而,其余 3 行会定期更新。我知道在 VIEW 上创建触发器比较困难。

包含数据的表格示例如下:

 |itemID|imtemStatus|itemCode|itemTime|
 |------|-----------|--------|--------|
 |  1   |  OK       |  30    |  00:10 |
 |------|-----------|--------|--------|
 |  2   |  OK       |  40    |  02:30 |
 |------|-----------|--------|--------|
 |  3   |  STOPPED  |  30    |  00:01 |
 |------|-----------|--------|--------|

当 itemStatus = STOPPED & itemCode = 30

我想执行一个存储过程 (sp_Alert),将 itemID 作为参数传递

任何帮助将不胜感激

【问题讨论】:

您不能在视图上放置触发器,而且无论如何这也不是您想要的方式。与其询问视图和存储过程,不如解释您实际想要实现的目标。你想要的方式几乎肯定不是最好的方式。 @TabAlleman 无法查看有instead of 触发器? 您引用的触发器将属于基表。但我不得不同意,这里的概念似乎不太理想。您的问题最大的问题是不清楚您在这里真正想要做什么。 嗯,我的立场是正确的。您可以在可更新视图上放置触发器。在这种情况下,听起来仍然是个坏主意。 michaeljswart.com/2012/10/triggers-on-views-what-for @Tab Alleman 您可以在视图上放置触发器。当问题中提到的两个值存在时,我正在尝试执行存储过程。您对如何实现这一目标有什么建议吗? 编辑没有触发器 【参考方案1】:

由于触发器至少“不容易”,我想提出一个丑陋但实用的出路。您可以创建一个检查 ItemCode 和 ItemStatus 的存储过程。如果它们符合您的条件,您可以从此过程启动 sp_Alert。

create procedure check_status as 
if (select 1 
      from vw_itemstatus 
     where itemStatus = 'STOPPED' 
       and itemCode = 30) is not null
begin
declare @item_id int 
    set @item_id = (select itemID 
                      from vw_itemstatus 
                     where itemStatus = 'STOPPED' 
                       and itemCode = 30)
    exec sp_Alert @item_id
end

根据此功能的重要性以及您可以使用多少资源,您可以通过 SQL Server 代理安排此过程。如果您以较短的时间间隔运行它,它将与您的想法“相似”。

【讨论】:

为您的建议喝彩。我可以使用 phpjavascript 和服务器发送的事件执行此操作,但是我正在尝试开发一个仅 SQL 的解决方案(网络问题、浏览器问题等!),我也在查看任务计划程序,但是最短“执行”时间是 1分钟,我正在尝试跟踪实时数据更改。我将进一步研究 SQL Server 代理。

以上是关于当使用特定值更新多个列时,在 VIEW 上使用触发器执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

更新另一列时自动更新sql列

触发器 - 如何在更新另一列时更改另一列 - MySQL

当 css 值改变时触发事件

在 Mysql 中添加新列时如何轻松维护审计触发器

仅在修改列时触发 SQL 更新

触发推送通知-实现特定对象[关闭]