sql - 触发器不会执行存储过程
问题描述
我有以下触发器:
USE SomeDB
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [Staging].[RunPivot15]
ON [Staging].[UriData]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
EXEC [Staging].[PivotData]
END
它不会着火。相关表每五分钟接收大约 30 行。从那时起,我就被困住了。我一直在阅读,因为要插入不止一行,所以我必须运行一个游标。我已经尝试过光标,但也无法让它工作。
你能建议这里最好的方法是什么吗?
TIA
解决方案
触发器不运行的可能性很小。在触发器中的过程调用周围添加几个打印语句,最终也在您的存储过程中。这将帮助您在 Management Studio 中运行更新语句以触发触发器时跟踪执行情况。
USE SomeDB
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [Staging].[RunPivot15]
ON [Staging].[UriData]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
PRINT 'Before call.'
EXEC [Staging].[PivotData]
PRINT 'After call.'
END
然后在 Management Studio 中运行更新语句并检查消息选项卡以查看是否打印了您的消息。
update Staging.RunPivot15 set SomeColumn = SomeColumn where SomeColumn = SomeValue
不,您不需要游标。当你的触发器被执行时,如果不止一行受到影响,插入/删除的伪表中也会有多行。在您的情况下,您也不会读取更新了哪些行,因此只需运行该过程。如果您需要知道确切修改了哪些行,则编写代码以基于集合的方法处理它们(一次所有行)。在数据库中,使用游标循环实际上不是一个好主意。
推荐阅读
- c# - 获得最高质量的图像/屏幕截图 C# wpf
- python - 如何检查 sympy 函数是否为奇数?
- c++ - 在地图中存储通用回调
- swift - 显示上限 SKRange
- c# - 密码的加盐和散列应该在数据库中的 C# 服务器端代码还是 T-SQL 代码中执行?(对于 ASP.NET Core MVC)
- windows - 为什么我无法在 Windows 上访问从 Minikube 公开的服务?
- docker - 头:无法打开“/etc/ssl/certs/java/cacerts”进行阅读:Debian Image Java 11 中没有这样的文件或目录
- c# - 用户登录后保存数据以备后用?
- r - 如何解决使用 mutate 创建此变量后未找到的错误对象?
- java - 显示来自 Firebase 存储的数据