복붙노트

[SQL] 두 데이터베이스 사이에 외래 키 관계를 추가

SQL

두 데이터베이스 사이에 외래 키 관계를 추가

나는 두 개의 서로 다른 데이터베이스에 두 개의 테이블이있다. 표 1에서 (database1에서)가 열라는 컬럼 1이며 기본 키이다. 이제 표 2 (DATABASE2에)가 열라고 2 열 내가 외래 키로 추가 할 수 있습니다.

나는 그것을 추가하는 시도하고 나에게 다음과 같은 오류를했다 :

내가 어떻게해야합니까 테이블이 다른 데이터베이스에 있기 때문에 그.

해결법

  1. ==============================

    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에서 두 테이블을 원할 것하지만 할 수없는 경우. 그런 다음 위의 당신을위한 잠재적 인 작업 주위입니다.

  2. ==============================

    2.당신은 고체 무결성을 흔들 필요가있는 경우, 하나의 데이터베이스에서 두 테이블을, 그리고 FK 제약 조건을 사용합니다. 부모 테이블이 다른 데이터베이스에 있으면 아무 것도 이전 백업에서 해당 부모 데이터베이스를 복원에서 누군가를 방지하지 않으며, 당신은 고아가 있습니다.

    당신은 고체 무결성을 흔들 필요가있는 경우, 하나의 데이터베이스에서 두 테이블을, 그리고 FK 제약 조건을 사용합니다. 부모 테이블이 다른 데이터베이스에 있으면 아무 것도 이전 백업에서 해당 부모 데이터베이스를 복원에서 누군가를 방지하지 않으며, 당신은 고아가 있습니다.

    데이터베이스 간의 FK가 지원되지 않는 이유입니다.

  3. ==============================

    3.관련된 두 개의 테이블에 대한 정보의 주요 권위있는 소스가 두 개의 별도의 데이터베이스에 있어야한다 (사용하여 보조 위치로 기본 위치에서 테이블의 복사본을 동기화 할 때 내 경험에 의하면, 가장 좋은 방법은이 문제를 처리하는 T- 적절한 오류 검사와 SQL 또는 SSIS -이 외래 키 참조를 가지고있는 동안 당신이 그렇게 피부에 몇 가지 방법 테이블 업데이트에 고양이)가, 절단 및 테이블을 다시 채울 수 없습니다.

    관련된 두 개의 테이블에 대한 정보의 주요 권위있는 소스가 두 개의 별도의 데이터베이스에 있어야한다 (사용하여 보조 위치로 기본 위치에서 테이블의 복사본을 동기화 할 때 내 경험에 의하면, 가장 좋은 방법은이 문제를 처리하는 T- 적절한 오류 검사와 SQL 또는 SSIS -이 외래 키 참조를 가지고있는 동안 당신이 그렇게 피부에 몇 가지 방법 테이블 업데이트에 고양이)가, 절단 및 테이블을 다시 채울 수 없습니다.

    그리고 효율적입니다 테이블에 두 번째 위치에 전통적인 FK 관계를 추가 읽기 전용 복사합니다.

    당신은 업데이트 된 복사본을 유지하기 위해 기본 위치에 트리거 또는 예약 된 작업을 사용할 수 있습니다.

  4. ==============================

    4.당신은 수표를 만들기 위해 사용자 정의 기능을 점검 제한 조건을 사용할 수 있습니다. 그것은 트리거보다 더 신뢰할 수있다. 그것은 장애인이어야하며 DATABASE2 복원 필요한 경우 외래 키와 동일하고 재 점검 한 후 다시 활성화 할 수 있습니다.

    당신은 수표를 만들기 위해 사용자 정의 기능을 점검 제한 조건을 사용할 수 있습니다. 그것은 트리거보다 더 신뢰할 수있다. 그것은 장애인이어야하며 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)
    
  5. ==============================

    5.오류 메시지 상태로 - 짧은 대답은 (SQL 2008) SQL 서버 데이터베이스 간 외래 키를 지원하지 않는다는 것입니다.

    오류 메시지 상태로 - 짧은 대답은 (SQL 2008) SQL 서버 데이터베이스 간 외래 키를 지원하지 않는다는 것입니다.

    당신은 선언적 참조 무결성합니다 (FK)를 가질 수 있지만, 당신은 트리거를 사용하여 같은 목표에 도달 할 수 있습니다. 당신이 쓰는 논리가 버그가있을 수 있기 때문에, 조금 덜 신뢰할 수있는, 그러나 당신이이 똑같이 얻을 것이다.

    는 SQL 문서를 참조하십시오 @ http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx 어떤 상태 :

    OK의 토론 SQLTeam에 걸쳐도있다 - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135

  6. ==============================

    6.오류 메시지가 말했듯이, 이것은 SQL 서버에서 지원되지 않습니다. refrerential 무결성을 보장 할 수있는 유일한 방법은 트리거와 함께 작동하는 것입니다.

    오류 메시지가 말했듯이, 이것은 SQL 서버에서 지원되지 않습니다. refrerential 무결성을 보장 할 수있는 유일한 방법은 트리거와 함께 작동하는 것입니다.

  7. from https://stackoverflow.com/questions/4452132/add-foreign-key-relationship-between-two-databases by cc-by-sa and MIT license