SQL Server触发器没有';从ASP.NET网页插入记录时不会激发
我有个棘手的问题。我正在用ASP.NET开发一个web应用程序,数据库是SQL Server Express 2005。我编写了一个触发器,在插入或更新记录时更新另一个表的列值 这两张桌子是空的SQL Server触发器没有';从ASP.NET网页插入记录时不会激发,asp.net,sql-server,triggers,Asp.net,Sql Server,Triggers,我有个棘手的问题。我正在用ASP.NET开发一个web应用程序,数据库是SQL Server Express 2005。我编写了一个触发器,在插入或更新记录时更新另一个表的列值 这两张桌子是空的 InvtVendorInvoices(触发器在此表中,触发器名称为Onater_VendorInvoices) InvtMaster(此表的冒号“invtAmtOthers”值从InvtVendor上的触发器更新) 当我从InvtVendorInvoices表中的SQL Server Managemen
USE [Stone]
GO
/****** Object: Table [dbo].[InvtMaster] Script Date: 12/10/2009 22:19:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[InvtMaster](
[invtID] [int] IDENTITY(1,1) NOT NULL,
[invtDate] [datetime] NULL,
[invtSupID] [int] NULL,
[invtRefNo] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtRefDate] [datetime] NULL,
[invtPOID] [int] NULL,
[invtCurID] [int] NULL,
[invtPayTermsID] [int] NULL,
[invtLocationID] [int] NULL,
[invtNotesPrinted] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtNotesInternal] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtAmtMaterial] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtTotal] DEFAULT ((0)),
[invtAmtFreight] [money] NULL,
[invtAmtOthers] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtOthers] DEFAULT ((0)),
[invtStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtStatusID] DEFAULT ((0)),
[invtWflStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtWflStatusID] DEFAULT ((0)),
[invtOwnerID] [int] NULL,
CONSTRAINT [PK_InvtMaster] PRIMARY KEY CLUSTERED
(
[invtID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
USE [Stone]
GO
/****** Object: Table [dbo].[InvtMaster] Script Date: 12/10/2009 22:23:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[InvtMaster](
[invtID] [int] IDENTITY(1,1) NOT NULL,
[invtDate] [datetime] NULL,
[invtSupID] [int] NULL,
[invtRefNo] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtRefDate] [datetime] NULL,
[invtPOID] [int] NULL,
[invtCurID] [int] NULL,
[invtPayTermsID] [int] NULL,
[invtLocationID] [int] NULL,
[invtNotesPrinted] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtNotesInternal] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtAmtMaterial] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtTotal] DEFAULT ((0)),
[invtAmtFreight] [money] NULL,
[invtAmtOthers] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtOthers] DEFAULT ((0)),
[invtStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtStatusID] DEFAULT ((0)),
[invtWflStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtWflStatusID] DEFAULT ((0)),
[invtOwnerID] [int] NULL,
CONSTRAINT [PK_InvtMaster] PRIMARY KEY CLUSTERED
(
[invtID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
USE [Stone]
GO
/****** Object: Trigger [dbo].[OnAlter_VendorInvoice] Script Date: 12/10/2009 22:25:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Farooq
-- Create date: 10-Dec-09
-- Description: When the Inventory Invoice Is Created, the total amout for all the additional cost is calculated and updated in the invtAmtOthers field in the InvtMaster Table
-- =============================================
CREATE TRIGGER .[dbo].[OnAlter_VendorInvoice]
ON .[dbo].[InvtVendorInvoices]
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
declare @invtID int;
declare @value float;
select @invtID=invInvtID from inserted;
--The ISNULL is used to convert the NULL returned value to ZERO
select @value=ISNULL(sum(invAmtTotal),0) from InvtVendorInvoices where invInvtID=@invtID;
--select @value=sum(invAmtTotal) from InvtVendorInvoices where invInvtID=@invtID;
update InvtMaster set invtAmtOthers=@value where invtID=@invtID;
END
触发器我有…
USE [Stone]
GO
/****** Object: Table [dbo].[InvtMaster] Script Date: 12/10/2009 22:19:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[InvtMaster](
[invtID] [int] IDENTITY(1,1) NOT NULL,
[invtDate] [datetime] NULL,
[invtSupID] [int] NULL,
[invtRefNo] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtRefDate] [datetime] NULL,
[invtPOID] [int] NULL,
[invtCurID] [int] NULL,
[invtPayTermsID] [int] NULL,
[invtLocationID] [int] NULL,
[invtNotesPrinted] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtNotesInternal] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtAmtMaterial] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtTotal] DEFAULT ((0)),
[invtAmtFreight] [money] NULL,
[invtAmtOthers] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtOthers] DEFAULT ((0)),
[invtStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtStatusID] DEFAULT ((0)),
[invtWflStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtWflStatusID] DEFAULT ((0)),
[invtOwnerID] [int] NULL,
CONSTRAINT [PK_InvtMaster] PRIMARY KEY CLUSTERED
(
[invtID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
USE [Stone]
GO
/****** Object: Table [dbo].[InvtMaster] Script Date: 12/10/2009 22:23:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[InvtMaster](
[invtID] [int] IDENTITY(1,1) NOT NULL,
[invtDate] [datetime] NULL,
[invtSupID] [int] NULL,
[invtRefNo] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtRefDate] [datetime] NULL,
[invtPOID] [int] NULL,
[invtCurID] [int] NULL,
[invtPayTermsID] [int] NULL,
[invtLocationID] [int] NULL,
[invtNotesPrinted] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtNotesInternal] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[invtAmtMaterial] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtTotal] DEFAULT ((0)),
[invtAmtFreight] [money] NULL,
[invtAmtOthers] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtOthers] DEFAULT ((0)),
[invtStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtStatusID] DEFAULT ((0)),
[invtWflStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtWflStatusID] DEFAULT ((0)),
[invtOwnerID] [int] NULL,
CONSTRAINT [PK_InvtMaster] PRIMARY KEY CLUSTERED
(
[invtID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
USE [Stone]
GO
/****** Object: Trigger [dbo].[OnAlter_VendorInvoice] Script Date: 12/10/2009 22:25:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Farooq
-- Create date: 10-Dec-09
-- Description: When the Inventory Invoice Is Created, the total amout for all the additional cost is calculated and updated in the invtAmtOthers field in the InvtMaster Table
-- =============================================
CREATE TRIGGER .[dbo].[OnAlter_VendorInvoice]
ON .[dbo].[InvtVendorInvoices]
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
declare @invtID int;
declare @value float;
select @invtID=invInvtID from inserted;
--The ISNULL is used to convert the NULL returned value to ZERO
select @value=ISNULL(sum(invAmtTotal),0) from InvtVendorInvoices where invInvtID=@invtID;
--select @value=sum(invAmtTotal) from InvtVendorInvoices where invInvtID=@invtID;
update InvtMaster set invtAmtOthers=@value where invtID=@invtID;
END
ASPX网页在按钮点击事件上有以下插入记录代码
Dim cmd As New SqlCommand
cmd.CommandText = "INSERT INTO InvtVendorInvoices (invSupID,invInvtID,invRefNo,invDesc,invDate,invDateDue,invAmtTotal,invNotesInternal) VALUES (@invSupID,@invInvtID,@invRefNo,@invDesc,@invDate,@invDateDue,@invAmtTotal,@invNotesInternal)"
cmd.Connection = DataHelper.GetConnection
cmd.Parameters.Add("@invSupID", SqlDbType.Int).Value = e.NewValues("invSupID")
cmd.Parameters.Add("@invInvtID", SqlDbType.Int).Value = lblInvtID.Text
cmd.Parameters.Add("@invRefNo", SqlDbType.NVarChar).Value = e.NewValues("invRefNo")
cmd.Parameters.Add("@invDesc", SqlDbType.NText).Value = e.NewValues("invDesc")
cmd.Parameters.Add("@invDate", SqlDbType.DateTime).Value = e.NewValues("invDate")
cmd.Parameters.Add("@invDateDue", SqlDbType.DateTime).Value = e.NewValues("invDateDue")
cmd.Parameters.Add("@invAmtTotal", SqlDbType.Money).Value = e.NewValues("invAmtTotal")
cmd.Parameters.Add("@invNotesInternal", SqlDbType.NText).Value = e.NewValues("invNotesInternal")
cmd.Connection.Open()
cmd.ExecuteNonQuery()
你怎么知道扳机没响?也许触发器确实触发了,但是更新没有找到任何满足条件的记录,其中invtID=@invtID?可能是您从ManagementStudio尝试的测试值在InvtMaster中有相应的记录,但当ASP页面运行代码时,没有记录 我已经解决了这个问题。。。实际上,在父网页中有一个回调面板,它也在更新invtAmtOthers Column。在插入/更新记录后正在执行回调 您好,我已经用InvtMaster中的一条记录测试了我的逻辑,当我在InvtVendorInvoices表中插入一条记录时,我试图通过该记录的invtID。毫无疑问,有一个错误的invtID。此外,如果我们正在更新现有记录,则将在正在更新的表“InvtVendorInvoices”中正确更新该值,但应在InvtMaster表中更新该值的触发器根本不会更新。但是,如果我从SQL Management Studio更新InvtVendorInvoices记录,则其工作正常。我可以看到InvtMaster表中的记录正确更新。为了禁用触发器执行,会话必须非常长。如果在触发器中添加RAISERROR(),则在ASP调用中是否会抛出该错误?如果是,您有证据表明触发器已执行,但更新未完成。嗨,雷姆斯,谢谢您的宝贵建议。我已经在触发器中添加了RAISEERROR(),但是网页逻辑执行时没有抛出任何异常。。。请建议…要禁用触发器,必须明确使用禁用触发器,请参阅。确保您没有犯任何错误,比如更新不同的表(连接字符串指向不同的db)或类似的错误。