>

오류를 유발하는 것을 찾아서 테스트하기 쉽기 때문에 SQL 접근 방식을 그대로 유지했기 때문에 전체 질문을 편집했습니다.

may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

DROP TABLE dbo.ProductionUnits
CREATE TABLE ProductionUnits
(
    Id INT PRIMARY KEY IDENTITY,
    Name NVARCHAR(50)
)
DROP TABLE Cells
CREATE TABLE Cells
(
    Id INT PRIMARY KEY IDENTITY,
    Name NVARCHAR(10),
    ProductionUnitId INT FOREIGN KEY REFERENCES ProductionUnits(Id) ON DELETE CASCADE ON UPDATE CASCADE 
)
DROP TABLE CheckLists
CREATE TABLE CheckLists
(
    Id INT PRIMARY KEY IDENTITY,
    Name NVARCHAR(20),
    CellId INT FOREIGN KEY REFERENCES Cells(Id) ON DELETE CASCADE ON UPDATE CASCADE
)
DROP TABLE CheckListGroups
CREATE TABLE CheckListGroups
(
    Id INT PRIMARY KEY IDENTITY,
    Name NVARCHAR(20),
    CheckListId INT FOREIGN KEY REFERENCES CheckLists(Id) ON DELETE CASCADE ON UPDATE CASCADE
)
DROP TABLE CheckListGroupItems
CREATE TABLE CheckListGroupItems
(
    Id INT PRIMARY KEY IDENTITY,
    Name NVARCHAR(20),
    CheckListGroupId INT FOREIGN KEY REFERENCES CheckListGroups(Id) ON DELETE CASCADE ON UPDATE CASCADE
)

DROP TABLE Shifts
CREATE TABLE Shifts
(
    Id INT PRIMARY KEY IDENTITY,
    StartTime TIME,
    EndTime TIME,
    ShiftDescription NVARCHAR(20),
    ProductionUnitId INT FOREIGN KEY REFERENCES ProductionUnits(Id) ON DELETE CASCADE ON UPDATE CASCADE
)
DROP TABLE ProductionRecords
CREATE TABLE ProductionRecords
(
    Id INT PRIMARY KEY IDENTITY,
    CreatedOn DATETIME,
    CreatedBy NVARCHAR(50),
    ModifiedOn DATETIME,
    ModifiedBy NVARCHAR(50)
)
DROP TABLE dbo.Referencias
CREATE TABLE Referencias
(
    Id INT PRIMARY KEY IDENTITY,
    Name NVARCHAR(15),
)
DROP TABLE dbo.CheckListRecords
CREATE TABLE CheckListRecords
(
    Id INT PRIMARY KEY IDENTITY,
    Value NVARCHAR(3),
    ReferenciaId INT FOREIGN KEY REFERENCES Referencias(Id) ON DELETE CASCADE ON UPDATE CASCADE,
    ShiftId INT FOREIGN KEY REFERENCES Shifts(Id) ON DELETE CASCADE ON UPDATE CASCADE,
    CheckListGroupItemId INT FOREIGN KEY REFERENCES dbo.CheckListGroupItems(Id) ON DELETE CASCADE ON UPDATE CASCADE,
    ProductionRecordsId INT FOREIGN KEY REFERENCES ProductionRecords(Id) ON DELETE CASCADE ON UPDATE CASCADE 
)  

문제는 내가 추가 할 때입니다

CheckListGroupItemId INT FOREIGN KEY REFERENCES dbo.CheckListGroupItems(Id) ON DELETE CASCADE ON UPDATE CASCADE,

그러나 어떤 항목이 속하는지 알기 위해 이것이 필요하지만 ON DELETE CASCADE를 삭제하면 작동합니다

외래 키와 캐스케이드 경로 처리와 관련하여 SQL에 익숙하지 않습니다.

이 상황에서 어떻게해야합니까?

  • 답변 # 1

    CheckListRecords 를 삭제하는 경로는 두 가지가 있습니다   ProductionUnits 를 삭제할 때  열. 이것이 불평하는 것입니다.

    ProductionUnits ->
     Cells ->
      CheckLists ->
       CheckListGroups ->
        CheckListGroupItems ->
         CheckListRecords
    
    

    ... 그리고 ...

    ProductionUnits ->
     Shifts ->
      CheckListRecords
    
    

    버머-당신은 그것을 가질 수 없습니다 ... 그것을 둘러 볼 수있는 간단한 방법은 없습니다 :-(

    일반적인 일입니다. 그러나 희망을 가지고-그것을 처리하는 합리적인 방법이 있습니다 ... 그것은 너무 끔찍하지 않습니다. 그런 메시지가 나오면 테이블에서 뒤로 물러나서 여러 ON DELETE CASCADE 를 찾으십시오.  같은 테이블을 가리키는 삭제 경로의 열에서 범인을 찾았습니다.

    솔루션을 제안하기 전에 몇 가지 관찰 사항이 있습니다. 한 가지로, 당신은 ID로 생성 된 ID를 가지고 있습니다. 그래서, On Update Cascade  어딘가에서 심하게 행동하지 않는 한 ID를 쉽게 변경할 수 없기 때문에 그러한 세계에서 지정해서는 안됩니다.

    또 다른 사소한 모범 사례 참고 사항 : 테이블을 만들 때 스키마를 지정하십시오 :

    CREATE TABLE dbo.ProductionUnits
    (
       -- etc.
    )
    
    

    ... 및항상은 뷰 및 프로 시저에서 테이블을 참조 할 때 스키마를 사용합니다.

    좋아요-어떻게 갈등을 다룰까요? CheckListRecords 에서 외래 키를 제거하는 것이 좋습니다.   Shifts 로  대신 Shifts 에서삭제 트리거를 구현하십시오.  영향을받는 CheckListRecords 를 삭제합니다  행. 오래 전 ... 선언적인 참조 무결성이 있기 전에 트리거로 관계를 관리해야했습니다. 여전히 이런 장소에서 유용합니다.

    스키마를 테이블 선언에 추가했다고 가정하면 대략 다음과 같습니다.

    create trigger [Shifts.Delete.Trigger] on dbo.Shifts for delete as
    begin
      set nocount on;
      delete dbo.CheckListRecords where ShiftId in ( select Id from deleted );
    end
    
    

    그거 그렇게 나쁘진 않나요?

    만약 wemwyz를해야한다면  어떤 이유로 든 조금 더 복잡해집니다. Shifts.Id 에 대체 키가 있어야합니다.  논리를 구현하기 위해 테이블 ​​... 바람직하게 업데이트하지 않는 열 또는 Shifts 시 업데이트되지 않은 열  변경됩니다. 어쩌면 Id  기둥? 당신은 StartTime 를 추가 할 수 있습니다  후보 키가없는 경우 열 예를 들면 다음과 같습니다.

    uniqueidentifier
    
    

    대부분의 관점과 논리는이 칼럼을 완전히 무시합니다. EF가 볼 필요조차 없습니다. 내가 선언 한 방식으로 삽입시 자동으로 설정됩니다 (식별 열과 유사).

    CREATE TABLE Shifts ( Id INT PRIMARY KEY IDENTITY, StartTime TIME, EndTime TIME, ShiftDescription NVARCHAR(20) , ProductionUnitId INT FOREIGN KEY REFERENCES ProductionUnits(Id) ON DELETE CASCADE ON UPDATE CASCADE, RowId UNIQUEIDENTIFIER CONSTRAINT [Shifts.RowId.Default] DEFAULT ( NEWID() ) CONSTRAINT [Shifts.RowId.Unique] UNIQUE ) 를 사용하는 유일한 코드  업데이트 트리거입니다 :

    RowId
    
    

    매우 끔찍하지는 않지만 이상적이지는 않다. 실제로 ID 열을 업데이트 할 이유가없는 경우 (실제로하지 않아야하는 경우)이 업데이트 트리거 및 추가 열 넌센스를 모두 건너 뛸 수 있습니다.

    트리거 기반 참조 무결성이있는 경우 EF에 대해 설명해야하지만 EF는 내 직원의 방식이 아니므로 특정 요점을 도울 수 없습니다. 그러나 데이터 모델을 EF에 설명 할 때 상당히 간단한 선언이라고 확신합니다.

    create trigger [Shifts.Update.Trigger] on dbo.Shifts for update as begin set nocount on; if update( Id ) --> just skip everything if the Id did not change begin update dbo.CheckListRecords set ShiftId = i.Id from inserted i inner join deleted d on i.RowId = d.RowId inner join dbo.CheckListRecords c on c.ShiftId = d.Id end end

  • 이전 graph - MATLAB에서 플로팅 시간 대 주파수
  • 다음 Whether rtlib - rtlib 여부 - lotus notes 리치 텍스트 라이브러리는 ibm domino server 64 비트를 지원합니다