'cursor_name' 不存在
'cursor_name' does not exist
出于审计目的,我写了以下触发器。当我尝试更新 Sales.SalesOrderHeader
table 中的记录时,出现以下错误:
Msg 16916, Level 16, State 1, Procedure tr_AuditUpdate, Line 11 A
cursor with the name 'c_Audit2' does not exist.
这是触发器:
USE [AdventureWorks2008R2]
GO
/****** Object: Trigger [Sales].[tr_AuditUpdate] Script Date: 9/19/2016 9:27:36 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [Sales].[tr_AuditUpdate]
on [Sales].[SalesOrderHeader]
for Update
AS
SET NOCOUNT ON
BEGIN
DECLARE @EntityCode1 int
DECLARE @OldStatus1 nvarchar(100)
DECLARE @NewStatus1 nvarchar(100)
if @@ROWCOUNT>0
DECLARE c_Audit2 CURSOR LOCAL FOR
Select d.SalesOrderID,d.Status,i.Status
From deleted AS d
join inserted AS i
on i.SalesOrderID=d.SalesOrderID
Open c_Audit2
Fetch Next From c_Audit2
INTO @EntityCode1, @OldStatus1, @NewStatus1
While @@FETCH_STATUS=0
BEGIN
execute sp_Audit @AuditedTable='Sales.SalesOrderHeader',
@EntityCode=@EntityCode1,
@OldStatus=@OldStatus1,
@NewStatus1=@NewStatus1,
@AuditUpdate='+',
@AuditInsert='-',
@AuditDelete='-'
Fetch Next From c_Audit2
INTO @EntityCode1, @OldStatus1, @NewStatus1
END
CLOSE c_Audit2
DEALLOCATE c_Audit2
END
这是更新语句
update Sales.SalesOrderHeader
set Status=4
where SalesOrderID=43659
只有在@@ROWCOUNT>0 时才会创建游标,正如您在触发器开头所写的那样。删除它 if 它将正常工作。
if @@ROWCOUNT>0
DECLARE c_Audit2 CURSOR LOCAL FOR
Select d.SalesOrderID,d.Status,i.Status
From deleted AS d
join inserted AS i
on i.SalesOrderID=d.SalesOrderID
open c_Audit2 -- fails when @@rowcount=0
因为 if 游标不会总是被创建。
那么你的下一条语句是
open c_Audit2
如果“@@ROWCOUNT>0”returns false
,那将失败
删除此代码:如果@@ROWCOUNT>0,您的触发器将起作用。
出于审计目的,我写了以下触发器。当我尝试更新 Sales.SalesOrderHeader
table 中的记录时,出现以下错误:
Msg 16916, Level 16, State 1, Procedure tr_AuditUpdate, Line 11 A cursor with the name 'c_Audit2' does not exist.
这是触发器:
USE [AdventureWorks2008R2]
GO
/****** Object: Trigger [Sales].[tr_AuditUpdate] Script Date: 9/19/2016 9:27:36 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [Sales].[tr_AuditUpdate]
on [Sales].[SalesOrderHeader]
for Update
AS
SET NOCOUNT ON
BEGIN
DECLARE @EntityCode1 int
DECLARE @OldStatus1 nvarchar(100)
DECLARE @NewStatus1 nvarchar(100)
if @@ROWCOUNT>0
DECLARE c_Audit2 CURSOR LOCAL FOR
Select d.SalesOrderID,d.Status,i.Status
From deleted AS d
join inserted AS i
on i.SalesOrderID=d.SalesOrderID
Open c_Audit2
Fetch Next From c_Audit2
INTO @EntityCode1, @OldStatus1, @NewStatus1
While @@FETCH_STATUS=0
BEGIN
execute sp_Audit @AuditedTable='Sales.SalesOrderHeader',
@EntityCode=@EntityCode1,
@OldStatus=@OldStatus1,
@NewStatus1=@NewStatus1,
@AuditUpdate='+',
@AuditInsert='-',
@AuditDelete='-'
Fetch Next From c_Audit2
INTO @EntityCode1, @OldStatus1, @NewStatus1
END
CLOSE c_Audit2
DEALLOCATE c_Audit2
END
这是更新语句
update Sales.SalesOrderHeader
set Status=4
where SalesOrderID=43659
只有在@@ROWCOUNT>0 时才会创建游标,正如您在触发器开头所写的那样。删除它 if 它将正常工作。
if @@ROWCOUNT>0
DECLARE c_Audit2 CURSOR LOCAL FOR
Select d.SalesOrderID,d.Status,i.Status
From deleted AS d
join inserted AS i
on i.SalesOrderID=d.SalesOrderID
open c_Audit2 -- fails when @@rowcount=0
因为 if 游标不会总是被创建。
那么你的下一条语句是
open c_Audit2
如果“@@ROWCOUNT>0”returns false
,那将失败删除此代码:如果@@ROWCOUNT>0,您的触发器将起作用。