프로젝트 배경 : 데이터베이스를 저장하는 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
없어 나는 오류 로그에 오류 메시지를 삽입합니다. 나는 그것이 중요하지 않다고 생각했기 때문에 테스트를 위해 무시했다.
그래 그건 아마의의 .. foesign 키 제약 조건이 무엇인지 이잖아. 데이터베이스의 복사본을 작업하고 있는데 한 달 만에 업데이트되지 않았으므로 작업중인 레코드가 시스템에 있다고 생각하지 않습니다. – VictoriaJay