当使用特定值更新多个列时,在 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 代理安排此过程。如果您以较短的时间间隔运行它,它将与您的想法“相似”。
【讨论】:
为您的建议喝彩。我可以使用 php、javascript 和服务器发送的事件执行此操作,但是我正在尝试开发一个仅 SQL 的解决方案(网络问题、浏览器问题等!),我也在查看任务计划程序,但是最短“执行”时间是 1分钟,我正在尝试跟踪实时数据更改。我将进一步研究 SQL Server 代理。以上是关于当使用特定值更新多个列时,在 VIEW 上使用触发器执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章