programing

SQL Server에서 캐스케이드 삭제를 사용하는 방법

skycolor 2023. 4. 7. 21:05
반응형

SQL Server에서 캐스케이드 삭제를 사용하는 방법

테이블이 2개 있습니다.T1과 T2는 데이터가 있는 기존 테이블입니다.우리는 T1과 T2 사이에 일대다 관계가 있다.T1에서 레코드가 삭제되고 T2에서 관련된 모든 레코드가 삭제되었을 때 SQL Server에서 캐스케이드 삭제를 수행하도록 테이블 정의를 변경하려면 어떻게 해야 합니까?

그들 사이에는 외국의 제약이 있다.T2에 대해 테이블을 삭제하거나 트리거를 만들고 싶지 않습니다.예를 들어, 직원을 삭제하면 검토 기록도 모두 사라집니다.

T1 - 종업원,

Employee ID      
Name
Status

T2 - 퍼포먼스 리뷰

Employee ID - 2009 Review
Employee ID - 2010 Review

SQL Server Management Studio의 기존 외부 키에 "Cascade 삭제"를 추가하려면:

먼저 외부 키를 선택하고 "DROP and Create To..."를 엽니다." 를 누릅니다.

여기에 이미지 설명 입력

그럼 그냥 추가해 주세요.ON DELETE CASCADE에게ADD CONSTRAINT명령어:

n 이 쿼리를 실행하려면 "Execute(실행)" 버튼을 누르십시오.

참고로 외부 키 목록을 가져와 "Cascade delete"가 설정된 키를 확인하려면 다음 스크립트를 실행합니다.

SELECT 
   OBJECT_NAME(f.parent_object_id) AS 'Table name',
   COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
   delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
     sys.foreign_key_columns AS fc,
     sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1

그리고 만약 네가 그걸 발견한다면DROP외부 키 제약으로 인해 특정 테이블을 사용할 수 있지만 문제의 원인이 되고 있는 FK를 알아낼 수 없습니다.그 후 다음 명령을 실행할 수 있습니다.

sp_help 'TableName'

이 문서의 SQL은 특정 테이블을 참조하는 모든 FK를 나열합니다.

이 모든 것이 도움이 되길 바랍니다.

손가락이 길어서 죄송합니다.난 그냥 요점을 말하려고 했을 뿐이야.

당신은 할 필요가 있을 것이다.

  • 기존 외부 키 제약 조건을 삭제합니다.
  • 를 사용하여 새로운 것을 추가합니다.ON DELETE CASCADE설정을 유효하게 합니다.

예를 들어 다음과 같습니다.

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE

SQL Server Management Studio를 사용하여 이 작업을 수행할 수 있습니다.

→ 테이블 디자인을 마우스 오른쪽 버튼으로 클릭하고 Relations(관계)로 이동한 후 왼쪽 창에서 외부 키를 선택한 다음 오른쪽 창에서 "INSERT and UPDATE specification(삽입 및 업데이트 사양)" 메뉴를 확장하고 "Cascade(캐스케이드)"를 Delete Rule(삭제 규칙)로 선택합니다.

SQL Server Management Studio

다음과 같은 것을 사용하다

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;

올바른 열 이름을 입력하면 설정이 완료됩니다.mark_s가 올바르게 기술한 바와 같이 이미 외부 키 제약이 있는 경우 먼저 오래된 키를 삭제한 후 새 키를 작성해야 할 수 있습니다.

ON DELETE CASCADE
상위 데이터가 삭제될 때 하위 데이터가 삭제되도록 지정합니다.

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);

이 외부 키의 경우,ON DELETE CASCADE Server는 테이블 내의 따라서 이 예에서 product_id 값이 제품 테이블에서 삭제되면 이 product_id를 사용하는 인벤토리 테이블 내의 대응하는 레코드도 삭제됩니다.

먼저 ONCascade 속성을 활성화하려면:

1. 기존 외부 키 제약 조건을 삭제합니다.

2. ON DELETE CASCADE 설정이 유효하게 되어 있는 새로운 설정을 추가합니다.

예:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 

ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

두 번째로 ONCascade 속성을 비활성화하려면:

1. 기존 외부 키 제약 조건을 삭제합니다.

2. [ON DELETE NO ACTION]설정이 유효하게 되어 있는 새로운 설정을 추가합니다.

예:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE NO ACTION 
END

1 대 다의 관계가 T1에서 T2까지의 관계라면 함수를 나타내지 않기 때문에 결과 T2 값이 연역적으로 유효한 T1 결합 T2의 배수를 생략하지 않는다는 것을 보증하는 역함수를 추론하거나 추론하는 데 사용할 수 없습니다.( 함수를 나타내는 것이 프라이머리 키의 목적입니다).SQL think의 답은 yes입니다.관계형 사고에서 정답은 할 수 없다는 것이다.Codd 1970의 애매한 점을 참조해 주세요.T1에서 T2까지의 관계는 다대일이어야 합니다.

이것이 실제 생산 데이터라면 테이블 스키마에 영향을 주지 않는 내용만 삭제하면 안 된다고 생각합니다.

언급URL : https://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server

반응형