나는 이상한 문제가 있습니다. ASP.NET에서 개발 한 웹 응용 프로그램을 가지고 있는데 데이터베이스는 SQL Server Express 2005입니다. 레코드를 삽입하거나 업데이트 할 때 다른 테이블의 열 값을 업데이트하는 트리거를 작성했습니다.ASP.NET 웹 페이지에서 레코드를 삽입 할 때 SQL Server 트리거가 실행되지 않습니다.
두 개의 테이블이
InvtVendorInvoices 있습니다
는
InvtMaster (이 테이블의 coloumn "invtAmtOthers"값은 InvtVendorInvoices에 트리거에서 업데이트되는 (트리거는이 테이블에 트리거 이름은 OnAlter_VendorInvoices입니다))
레코드를 삽입하거나 업데이트 할 때 SQL Server 관리 Studio Express InvtVendorInvoices 테이블에서 InvtMaster 테이블의 "invtAmtOthers"coloumn 값이 성공적으로 업데이트되고 있습니다. 그러나 삽입 또는 .aspx 웹 페이지에서 레코드를 업데이트 할 때 트리거가 발생하지 않습니다. 흥미로운 점은 웹 페이지에서 삽입하려고 시도한 레코드가 InvtVendorInvoices 테이블에 삽입되거나 업데이트되지만 트리거가 실행되지 않고 InvtMaster 테이블의 "invtAmtOther"콜론이 변경되지 않은 상태로 유지된다는 것입니다.
인터넷에서 많은 검색을 수행했지만 해결책을 찾지 못했습니다.
이 혼란에서 제발 도와주세요 ...
는 어떤 도움을 매우 높이 평가 될 것이다. 나는이 한
데이터베이스 테이블 ... 내가 가진
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 [email protected];
--select @value=sum(invAmtTotal) from InvtVendorInvoices where [email protected];
update InvtMaster set [email protected] where [email protected];
END
영문 웹 페이지 버튼에서 다음 삽입 기록 코드가 클릭 이벤트
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()
안녕하세요, 는 내가 InvtMaster에서 하나의 레코드 만 내 논리를 테스트 한 내가 InvtVendorInvoices 테이블에 레코드를 삽입하는 동안 내가 특별히 그 기록의 invtID을 통과했습니다. 잘못된 invtID를 갖는 것에 대해서는 의문의 여지가 없습니다. 또한 기존 레코드를 업데이트하는 경우 값이 업데이트되는 "InvtVendorInvoices"테이블에서 올바르게 업데이트되지만 InvtMaster 테이블에서이 값을 업데이트해야하는 트리거는 전혀 업데이트되지 않습니다. – Farooq
그러나 SQL 관리 Studio에서 InvtVendorInvoices 레코드를 업데이트하면 제대로 작동합니다.InvtMaster 테이블의 레코드가 올바르게 업데이트 된 것을 볼 수 있습니다. – Farooq
트리거 실행을 비활성화하려면 세션 길이가 길어야합니다. 트리거에 RAISERROR()를 추가하면 ASP 호출에서 오류가 발생합니까? 그렇다면 트리거가 실행되지만 업데이트가 누락되었다는 증거가 있습니다. –