[sql] 두 데이터베이스 간의 외래 키 관계 추가

두 개의 서로 다른 데이터베이스에 두 개의 테이블이 있습니다. table1 (database1에 있음)에는 column1이라는 열이 있으며 기본 키입니다. 이제 table2 (database2)에 column2라는 열이 있으며이를 외래 키로 추가하고 싶습니다.

추가하려고했는데 다음과 같은 오류가 발생했습니다.

메시지 1763, 수준 16, 상태 0, 줄 1
데이터베이스 간 외래 키 참조는 지원되지 않습니다. 외래 키 Database2.table2.

메시지 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가 지원되지 않는 이유입니다.


답변

내 경험상, 관련된 두 테이블에 대한 기본 정보 소스가 두 개의 별도 데이터베이스에 있어야 할 때이를 처리하는 가장 좋은 방법은 기본 위치에서 보조 위치로 테이블 사본을 동기화하는 것입니다 (T- 적절한 오류 검사가있는 SQL 또는 SSIS-테이블에 외래 키 참조가있는 동안에는 테이블을 자르고 다시 채울 수 없으므로 테이블 업데이트시 고양이를 스키닝하는 몇 가지 방법이 있습니다.

그런 다음 두 번째 위치의 기존 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)


답변

짧은 대답은 SQL Server (SQL 2008 기준)가 오류 메시지에 나와있는 것처럼 데이터베이스 간 외래 키를 지원하지 않는다는 것입니다.

선언적 참조 무결성 (FK)을 가질 수는 없지만 트리거를 사용하여 동일한 목표에 도달 할 수 있습니다. 작성하는 로직에 버그가있을 수 있기 때문에 약간 덜 신뢰할 수 있지만 똑같이 얻을 수 있습니다.

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

트리거는 종종 비즈니스 규칙 및 데이터 무결성을 적용하는 데 사용됩니다. SQL Server는 테이블 생성 문 (ALTER TABLE 및 CREATE TABLE)을 통해 선언적 참조 무결성 (DRI)을 제공합니다. 그러나 DRI는 데이터베이스 간 참조 무결성을 제공하지 않습니다. 참조 무결성 (테이블의 기본 키와 외래 키 간의 관계에 대한 규칙)을 적용하려면 기본 및 외래 키 제약 조건 (ALTER TABLE 및 CREATE TABLE의 PRIMARY KEY 및 FOREIGN KEY 키워드)을 사용합니다. 트리거 테이블에 제약 조건이있는 경우 INSTEAD OF 트리거 실행 후 및 AFTER 트리거 실행 전에 확인됩니다. 제약 조건을 위반하면 INSTEAD OF 트리거 동작이 롤백되고 AFTER 트리거가 실행 (실행)되지 않습니다.

SQLTeam- http ://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135에서도 OK 토론이 있습니다 .


답변

오류 메시지에서 알 수 있듯이 SQL Server에서는 지원되지 않습니다. 굴절 무결성을 보장하는 유일한 방법은 트리거를 사용하는 것입니다.


답변