두 데이터베이스 간의 외부 키 관계 추가
두 개의 다른 데이터베이스에 두 개의 테이블이 있습니다.table1(database1)에는 column1이라고 하는 컬럼이 있으며 이는 프라이머리 키입니다.이제 table2(database2)에 column2라는 열이 있는데 이를 외부 키로 추가합니다.
추가하려고 했는데 다음 오류가 발생하였습니다.
16, 회선 1의 1763, 16, 0, 1
데이터베이스 간 외부 키 참조는 지원되지 않습니다.Database2.table2 입니다.16, 0, 1 메메1750, 16 、 0 、 1
을 사용하다이전 오류를 참조하십시오.
테이블이 다른 데이터베이스에 있는데 어떻게 해야 하나요?
트리거를 사용하여 데이터베이스 간에 참조 제약 조건을 관리해야 합니다.
기본적으로 기본 키 테이블에 키가 있는지 확인하기 위해 삽입 및 업데이트 트리거를 만듭니다.키가 존재하지 않으면 삽입 또는 업데이트를 되돌린 후 예외를 처리합니다.
예:
Create Trigger dbo.MyTableTrigger ON dbo.MyTable, After Insert, Update
As
Begin
If NOT Exists(select PK from OtherDB.dbo.TableName where PK in (Select FK from inserted) BEGIN
-- Handle the Referential Error Here
END
END
편집: 명확히 하기 위해.이것은 참조 무결성을 강제하는 최선의 접근법이 아닙니다.두 테이블을 모두 같은 DB에 저장하는 것이 이상적이지만 가능하지 않은 경우입니다.그럼, 상기는 당신에게 있어서 잠재적인 과제입니다.
견고한 무결성이 필요한 경우 두 테이블을 모두 하나의 데이터베이스에 저장하고 FK 구속조건을 사용하십시오.부모 테이블이 다른 데이터베이스에 있는 경우 다른 사용자가 이전 백업에서 부모 데이터베이스를 복원하는 것을 막을 수 없습니다. 그러면 고아 상태가 됩니다.
따라서 데이터베이스 간 FK가 지원되지 않습니다.
체크 제약 조건을 사용자 정의 함수와 함께 사용하여 체크할 수 있습니다.트리거보다 신뢰성이 높습니다.외부 키와 동일하게 비활성화했다가 필요할 때 다시 활성화할 수 있으며 database2 복원 후 다시 확인할 수 있습니다.
CREATE FUNCTION dbo.fn_db2_schema2_tb_A
(@column1 INT)
RETURNS BIT
AS
BEGIN
DECLARE @exists bit = 0
IF EXISTS (
SELECT TOP 1 1 FROM DB2.SCHEMA2.tb_A
WHERE COLUMN_KEY_1 = @COLUMN1
) BEGIN
SET @exists = 1
END;
RETURN @exists
END
GO
ALTER TABLE db1.schema1.tb_S
ADD CONSTRAINT CHK_S_key_col1_in_db2_schema2_tb_A
CHECK(dbo.fn_db2_schema2_tb_A(key_col1) = 1)
제 경험상으로는관련된 2개의 테이블에 대한 신뢰할 수 있는 정보의 주요 소스가 2개의 개별 데이터베이스에 있어야 하는 경우(T-SQL 또는 SSIS를 사용하여 적절한 오류 체크를 사용하여 테이블 복사본을 프라이머리 로케이션에서 세컨더리 로케이션으로 동기화하는 경우) 이를 처리하는 가장 좋은 방법은 테이블이 있는 동안에는 테이블을 잘라내고 다시 채울 수 없습니다.외부 키 참조이므로 테이블에서 고양이 가죽을 벗길 수 있는 몇 가지 방법이 있습니다.
그런 다음 두 번째 위치에 있는 기존 FK 관계를 사실상 읽기 전용 복사본인 테이블에 추가합니다.
기본 위치에서 트리거 또는 예약된 작업을 사용하여 복사본을 최신 상태로 유지할 수 있습니다.
간단히 말하면 SQL Server(2008년 기준)는 오류 메시지에서 알 수 있듯이 데이터베이스 간 외부 키를 지원하지 않습니다.
선언적 참조 무결성(FK)은 가질 수 없지만 트리거를 사용하여 동일한 목표에 도달할 수 있습니다.당신이 쓰는 논리에 오류가 있을 수 있지만, 똑같이 그렇게 할 수 있기 때문에 신뢰성이 떨어집니다.
SQL documents @ http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx 를 참조해 주세요.상태:
트리거는 비즈니스 규칙 및 데이터 무결성을 적용하는 데 자주 사용됩니다.SQL Server는 테이블 작성문(ALTER TABLE 및 CREATE TABLE)을 통해 선언적 참조 무결성(DRI)을 제공하지만 DRI는 데이터베이스 간 참조 무결성을 제공하지 않습니다.참조 무결성(테이블의 프라이머리 키와 외부 키 간의 관계에 관한 규칙)을 적용하려면 프라이머리 키와 외부 키 제약 조건(ALTER TABLE 및 CREATE TABLE의 PRIMAY KEY 키워드 및 FOREAND KEY 키워드)을 사용합니다.트리거 테이블에 제약 조건이 있는 경우, 제약 조건은 트리거 실행 후와 AFTER 트리거 실행 전에 검사됩니다.제약 조건을 위반하면 INTHE OF 트리거 액션이 롤백되고 AFTER 트리거가 실행되지 않습니다(발신).
SQLTeam에서도 OK에 대한 논의가 있습니다.http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135
데이터베이스에서 참조 무결성을 달성하는 것은 쉬운 작업이 아닙니다.
자주 사용되는 메커니즘의 목록을 다음에 나타냅니다.
- 복제 및 동기화:참조된 데이터는 정기적으로 복제되거나 참조 데이터베이스에 병합됩니다.이는 참조된 데이터가 거의 변경되지 않는 경우에 적합합니다.결국 동일한 데이터의 물리적 복사본이 2개 생기게 되며, 이러한 복사본을 동기화하는 신뢰성 높은 프로세스(예: ETL 파이프라인)가 필요합니다.
- 트리거: 참조 데이터와 참조 데이터에 대한 변경은 SQL 트리거에 의해 포착되므로 참조 무결성이 보장됩니다.그러나 트리거는 느릴 수 있으며 데이터베이스 복원 시 실행되지 않을 수 있습니다.작업 모니터링의 일부로 스케줄링된 일관성 검사를 실행하는 것은 나쁘지 않습니다.트리거를 설치하고 유지 관리하려면 참조된 데이터베이스에 대한 쓰기 액세스가 필요합니다.
- 제약조건 확인: SQL-Server는 모든 행이 특정 조건을 충족하는지 확인하는 사용자 정의 제약조건을 제공합니다.참조된 데이터에 행이 존재하는지 여부를 확인하는 사용자 정의 함수를 작성하여 참조 테이블에서 이 함수를 CHECK의 술어로 사용할 수 있습니다.참조된 데이터의 변경 내용은 캡처되지 않습니다.RDBMS 고유의 솔루션이지만 서버 경계를 넘어 기능합니다(링크된 서버 사용 등).기업의 ERP 시스템 내 기사 코드 등 삭제 또는 재할당되지 않는 글로벌 고유 ID를 참조할 때 적합합니다.
- 데이터베이스 아키텍처 재검토:위의 모든 메커니즘이 만족스럽지 않은 경우, 여러 데이터베이스를 단일 데이터베이스에 병합할 수 있습니다.원래 데이터베이스 이름은 스키마 이름이 될 수 있으므로 데이터베이스 개체를 효과적으로 그룹화할 수 있습니다.
오류 메시지에서 알 수 있듯이 이는 SQL 서버에서 지원되지 않습니다.참조 무결성을 보장하는 유일한 방법은 트리거를 사용하는 것입니다.
언급URL : https://stackoverflow.com/questions/4452132/add-foreign-key-relationship-between-two-databases
'IT' 카테고리의 다른 글
SQL에서 조회할 매개 변수를 전달하는 방법(Excel) (0) | 2023.04.23 |
---|---|
T-SQL에 해당하는 분할 함수? (0) | 2023.04.23 |
Excel 시트 이름에 유효한 문자 (0) | 2023.04.23 |
쿼리 문자열 없이 URL 가져오기 (0) | 2023.04.23 |
자동 레이아웃 - UIButton의 고유 크기에는 제목 삽입이 포함되지 않습니다. (0) | 2023.04.18 |