2014-06-23 3 views
2

프로젝트 배경 : 데이터베이스를 저장하는 MS-Access 2010 사용자 프런트 엔드 및 SQL Server 2008 백 엔드에서 작동하는. SQL에서 저장 프로 시저를 작성하고 SQL Server에서 실행 한 다음 VBA에서 Access로 호출합니다.INSERT 문이 외래 키 제약 조건과 충돌했습니다.

필요한 값을 검색하고 적절한 변수에 저장 한 후에 버튼을 누르면 저장 프로 시저를 호출하고 필요한 매개 변수를 전달합니다. 원하는 결과는 값이 테이블 tblFromICPMS에 저장되는 것입니다. 자신의 저장 프로 시저에 거짓말을

-2147217873
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_tblFromICPMS_tblWOSampleTest". The conflict occurred in database "GSATest", table "dbo.tblWOSampleTest". in ImportICPMS

나는 비슷한 문제를 가진 사람들의 질문에보고하고 문제가 보인다 대부분의 시간을했다 : I 버튼을 누를 때 나는 오류가 발생합니다. 스토어드 프로 시저의 문제점과 충돌이 원인 일 수있는 것을 실제로 파악할 수는 없습니다.

제공 사양 : 주어진 사양에서 외래 키가있는 테이블 (TblFromICPMS)을 만들기 위해 SQL 코드가 제공되었습니다. 여기

가에 대한 스크립트입니다

IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo]. [FK_tblFromICPMS_tblWOSampleTest]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblFromICPMS]')) 
    ALTER TABLE [dbo].[tblFromICPMS] 
     DROP CONSTRAINT [FK_tblFromICPMS_tblWOSampleTest] 
GO 

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[DF_tblFromICPMS_DateImported]') AND type = 'D') 
BEGIN 
    ALTER TABLE [dbo].[tblFromICPMS] 
    DROP CONSTRAINT [DF_tblFromICPMS_DateImported] 
END 
GO 

/****** Object: Table [dbo].[tblFromICPMS] Script Date: 5/14/2014 9:29:33 AM ******/ 
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tblFromICPMS]') AND type in (N'U')) 
    DROP TABLE [dbo].[tblFromICPMS] 
GO 

/****** Object: Table [dbo].[tblFromICPMS] Script Date: 5/14/2014 9:29:33 AM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tblFromICPMS]') AND type in (N'U')) 
BEGIN 
    CREATE TABLE [dbo].[tblFromICPMS] 
    (
[FromICPMSID] [int] IDENTITY(1,1) NOT NULL, 
[Sample Name] [nvarchar](255) NULL, 
[Date And Time Acquired] [nvarchar](255) NULL, 
[Analyte] [nvarchar](20) NULL, 
[Concentration] [nvarchar](255) NULL, 
[Units] [nvarchar](255) NULL, 
[DateImported] [datetime] NOT NULL, 
[DateAnalyzed] [datetime] NULL, 
[BatchID] [int] NOT NULL, 
[QueueID] [int] NULL, 
[WOID] [nvarchar](10) NULL, 
[SampleID] [int] NULL, 
[TestID] [int] NULL, 
[ActResult] [float] NULL, 
[Issue] [nvarchar](255) NULL, 
CONSTRAINT [PK_tblFromICPMS] PRIMARY KEY CLUSTERED ([FromICPMSID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
END 
GO 

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo]. [DF_tblFromICPMS_DateImported]') AND type = 'D') 
BEGIN 
    ALTER TABLE [dbo].[tblFromICPMS] 
    ADD CONSTRAINT [DF_tblFromICPMS_DateImported] 
     DEFAULT (getdate()) FOR [DateImported] 
END 
GO 

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo]. [FK_tblFromICPMS_tblWOSampleTest]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblFromICPMS]')) 
    ALTER TABLE [dbo].[tblFromICPMS] WITH CHECK 
    ADD CONSTRAINT [FK_tblFromICPMS_tblWOSampleTest] 
     FOREIGN KEY([WOID], [SampleID], [TestID]) 
     REFERENCES [dbo].[tblWOSampleTest] ([WOID], [SampleID], [TestID]) 
GO 

IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tblFromICPMS_tblWOSampleTest]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblFromICPMS]')) 
    ALTER TABLE [dbo].[tblFromICPMS] CHECK CONSTRAINT [FK_tblFromICPMS_tblWOSampleTest] 
GO 

그리고 여기 내 저장 프로 시저에 대한 스크립트입니다 몇 가지 추가 배경에 대한

CREATE PROCEDURE upInsertFromICPMSRecord 
    @SampleName nvarchar(60), 
    @DateTimeAcquired nvarchar(60), 
    @Analyte nvarchar(60), 
    @Concentration nvarchar(60), 
    @QueueID nvarchar(60), 
    @Units nvarchar(60), 
    @ThisWOID nvarchar(60), 
    @ThisSampleID nvarchar(60), 
    @ThisTestID nvarchar(60), 
    @ActResult nvarchar(60), 
    @Issue nvarchar(60), 
    @BatchID nvarchar(60) 
AS 
    INSERT INTO tblFromICPMS ("Sample Name","Date And TimeAcquired",Analyte,concentration,Units,DateImported,DateAnalyzed,BatchID, QueueID, WOID, SampleID, TestID, ActResult, Issue) 
    VALUES (@SampleName, @DateTimeAcquired, @Analyte, @Concentration, 
      @Units, getdate(), 
      CONVERT(datetime, @DateTimeAcquired), @BatchID, @QueueID, 
      @ThisWOID, @ThisSampleID, @ThisTestID, @ActResult, @Issue); 
GO 

, 내가 할 필요했다 다른 저장 프로 시저가 GetTestIdForAnalyte했다 기본적으로 처리중인 특정 파일에 대해 TESTID이 있는지 테스트했습니다. 영향을받는 행 수를 저장하는 출력 매개 변수가 있습니다. 따라서 0보다 큰 경우 TestID이 있다는 것을 알고 있습니다. 테스트 데이터베이스에서 작업 중이며 작업중인 파일이 시스템에 없으므로 testID이 존재하지 않습니다. 이 문제를 일으키는 지 모르겠지만, 여기에 대한 저장 프로 시저가 있습니다. TestID 후 나는 계속 내 다른 저장 프로 시저를 호출하여 레코드를 삽입 할 수있는 경우

CREATE PROCEDURE upGetTestIDForAnalyte 
    @WOID nvarchar(60), 
    @SampleID nvarchar(60), 
    @Analyte nvarchar(60), 
    @RecordsAffected int OUT 
AS 
    SELECT 
     TestID = t1.TestID 
    FROM 
     tblWOSampleTest t1 
    JOIN 
     tblTest t2 ON t1.TestID = t2.TestID; 
    WHERE 
     @WOID = t1.WOID 
     AND @SampleID = t1.SampleID 
     AND @Analyte = t2.Analyte 

    SET @RecordsAffected = @@ROWCOUNT 
GO 

없어 나는 오류 로그에 오류 메시지를 삽입합니다. 나는 그것이 중요하지 않다고 생각했기 때문에 테스트를 위해 무시했다.

답변

1

이것은 기본적으로 당신이 같은 WOID, SampleIDTestIDtblWOSampleTest에 일치하는 레코드가없는 tblFromICPMS에 레코드를 삽입하기 위해 노력하고 있음을 알려주는 제약. 당신이 tblFromICPMS에 삽입하기 전에 장소의 제약으로

, 당신은 그 값 tblWOSampleTest에 기록이 있어야합니다 -

http://www.w3schools.com/sql/sql_foreignkey.asp

+0

그래 그건 아마의의 .. foesign 키 제약 조건이 무엇인지 이잖아. 데이터베이스의 복사본을 작업하고 있는데 한 달 만에 업데이트되지 않았으므로 작업중인 레코드가 시스템에 있다고 생각하지 않습니다. – VictoriaJay

관련 문제