두 데이터베이스간에 외래 키 관계 추가
두 개의 다른 데이터베이스에 두 개의 테이블이 있습니다. 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 문서를 참조하십시오 .
Triggers are often used for enforcing business rules and data integrity. SQL Server provides declarative referential integrity (DRI) through the table creation statements (ALTER TABLE and CREATE TABLE); however, DRI does not provide cross-database referential integrity. To enforce referential integrity (rules about the relationships between the primary and foreign keys of tables), use primary and foreign key constraints (the PRIMARY KEY and FOREIGN KEY keywords of ALTER TABLE and CREATE TABLE). If constraints exist on the trigger table, they are checked after the INSTEAD OF trigger execution and prior to the AFTER trigger execution. If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger is not executed (fired).
There is also an OK discussion over at SQLTeam - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135
As the error message says, this is not supported on sql server. The only way to ensure refrerential integrity is to work with triggers.
참고URL : https://stackoverflow.com/questions/4452132/add-foreign-key-relationship-between-two-databases
'Development Tip' 카테고리의 다른 글
레일 명명 규칙을 어떻게 재정의합니까? (0) | 2020.10.23 |
---|---|
VS2010 : 솔루션 탐색기에서 "외부 종속성"폴더를 제거하거나 숨기는 방법 (0) | 2020.10.23 |
TypeScript에 'this'에 대한 별칭이 있습니까? (0) | 2020.10.23 |
연결 문자열이 유효한지 확인하는 방법은 무엇입니까? (0) | 2020.10.23 |
데이터베이스 대 플랫 파일 (0) | 2020.10.23 |