2009-12-10 4 views
1

나는 이상한 문제가 있습니다. ASP.NET에서 개발 한 웹 응용 프로그램을 가지고 있는데 데이터베이스는 SQL Server Express 2005입니다. 레코드를 삽입하거나 업데이트 할 때 다른 테이블의 열 값을 업데이트하는 트리거를 작성했습니다.ASP.NET 웹 페이지에서 레코드를 삽입 할 때 SQL Server 트리거가 실행되지 않습니다.

두 개의 테이블이

  1. InvtVendorInvoices 있습니다

  2. 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() 

답변

2

트리거가 작동하지 않는다는 것을 어떻게 알 수 있습니까? Mayber 트리거가 발생하지만 업데이트가 조건을 만족하는 레코드를 찾지 못합니다 WHERE [email protected]? Management Studio에서 시도한 테스트 값에 InvtMaster에서 해당 레코드가 있지만 ASP 페이지에서 코드를 실행하면 레코드가없는 것일 수 있습니다.

+0

안녕하세요, 는 내가 InvtMaster에서 하나의 레코드 만 내 논리를 테스트 한 내가 InvtVendorInvoices 테이블에 레코드를 삽입하는 동안 내가 특별히 그 기록의 invtID을 통과했습니다. 잘못된 invtID를 갖는 것에 대해서는 의문의 여지가 없습니다. 또한 기존 레코드를 업데이트하는 경우 값이 업데이트되는 "InvtVendorInvoices"테이블에서 올바르게 업데이트되지만 InvtMaster 테이블에서이 값을 업데이트해야하는 트리거는 전혀 업데이트되지 않습니다. – Farooq

+0

그러나 SQL 관리 Studio에서 InvtVendorInvoices 레코드를 업데이트하면 제대로 작동합니다.InvtMaster 테이블의 레코드가 올바르게 업데이트 된 것을 볼 수 있습니다. – Farooq

+0

트리거 실행을 비활성화하려면 세션 길이가 길어야합니다. 트리거에 RAISERROR()를 추가하면 ASP 호출에서 오류가 발생합니까? 그렇다면 트리거가 실행되지만 업데이트가 누락되었다는 증거가 있습니다. –

1

나는 실제로 invtAmtOthers coloumn을 업데이트하는 부모 웹 페이지에 콜백 패널이있었습니다. 콜백은 레코드를 삽입/갱신 한 후에 수행됩니다. 이

관련 문제