RaiseError 未出现在调用存储过程中的触发器中
RaiseError not appearing from Trigger in Calling Stored Procedure
我们有一个旧产品,多年来从最初内置于 SQL Server 2000 中缓慢向前发展,问题与 SQL 如何从 RaiseError 调用中冒出错误有关。
例如,我在 table 上有一个触发器,它会引发类似于此的错误:
ALTER TRIGGER [dbo].[Rotation_UTrig]
ON [dbo].[Rotation] FOR UPDATE AS
BEGIN
SET NOCOUNT ON
.
.
.
/* * VALIDATION RULE FOR FIELD 'RotationYear' */
RAISERROR ('Invalid value entered for RotationYear, must be >=0', 44444, 1)
goto fatalerror
.
.
fatalerror:
END
这在调用过程中具有所需的效果,即 if 语句具有 @@Error
的值:
update Rotation
set OrderedQuantity = @OrderedQuantity,
DespatchedQuantity = @DespatchedQuantity
where ID = @RotationNo
if @@Error != 0
begin
if @AlreadyInTrans = 0 begin rollback transaction end
raiserror ('Error on update of Rotation.', 16, 1)
goto fatalerror
end
.
.
.
fatalerror:
但是父调用应用程序看到的错误是:
Error Severity levels greater than 18 can only be specified by members of the sysadmin role, using WITH LOG option
这是因为触发器中的错误级别是44444,如果我加上
With LOG
到 Raiserror
的触发代码然后这将关闭连接(我们不想要)。如果我在触发器中将错误级别降低到 16,那么
if @@Error !=0
行未命中,因为 @@Error
设置为零。
除了使用
Try... Catch
围绕父过程中的更新语句,是否有任何其他方法可以将 @@Error
值冒泡到执行更新的过程中,以便过程代码(更新语句和以下 if @ @Error != 0) 可以保持不变吗?如果不是,那么这对我的应用程序来说是一个巨大的变化,因为我需要更改受影响的 tables 正在更新的所有位置以及所有触发器。
找到了!问题是,当另一个触发器出现并正常工作时,@@Error 被重置为 0。
我们有一个旧产品,多年来从最初内置于 SQL Server 2000 中缓慢向前发展,问题与 SQL 如何从 RaiseError 调用中冒出错误有关。
例如,我在 table 上有一个触发器,它会引发类似于此的错误:
ALTER TRIGGER [dbo].[Rotation_UTrig]
ON [dbo].[Rotation] FOR UPDATE AS
BEGIN
SET NOCOUNT ON
.
.
.
/* * VALIDATION RULE FOR FIELD 'RotationYear' */
RAISERROR ('Invalid value entered for RotationYear, must be >=0', 44444, 1)
goto fatalerror
.
.
fatalerror:
END
这在调用过程中具有所需的效果,即 if 语句具有 @@Error
的值:
update Rotation
set OrderedQuantity = @OrderedQuantity,
DespatchedQuantity = @DespatchedQuantity
where ID = @RotationNo
if @@Error != 0
begin
if @AlreadyInTrans = 0 begin rollback transaction end
raiserror ('Error on update of Rotation.', 16, 1)
goto fatalerror
end
.
.
.
fatalerror:
但是父调用应用程序看到的错误是:
Error Severity levels greater than 18 can only be specified by members of the sysadmin role, using WITH LOG option
这是因为触发器中的错误级别是44444,如果我加上
With LOG
到 Raiserror
的触发代码然后这将关闭连接(我们不想要)。如果我在触发器中将错误级别降低到 16,那么
if @@Error !=0
行未命中,因为 @@Error
设置为零。
除了使用
Try... Catch
围绕父过程中的更新语句,是否有任何其他方法可以将 @@Error
值冒泡到执行更新的过程中,以便过程代码(更新语句和以下 if @ @Error != 0) 可以保持不变吗?如果不是,那么这对我的应用程序来说是一个巨大的变化,因为我需要更改受影响的 tables 正在更新的所有位置以及所有触发器。
找到了!问题是,当另一个触发器出现并正常工作时,@@Error 被重置为 0。