문제

실버 라이트 애플리케이션에서 CRUD를 구현하고 있지만 전통적인 방식으로 삭제 기능을 구현하고 싶지는 않지만 대신 데이터베이스 안에 숨겨 지도록 데이터를 설정하고 싶습니다.

SQL Server 데이터베이스 에서이 작업을 수행하는 방법을 아는 사람이 있습니까?

대단히 감사합니다.

도움이 되었습니까?

해결책

Lukasz의 아이디어를 확장하면 DateTime 열도 유용합니다.

  • null = current
  • 값 = 소프트가 삭제 될 때

이것은 비트 열이 더 잘 작동 할 수 없다는 간단한 버전을 추가합니다.

다른 팁

값 0 또는 1을 갖는 "삭제 된"테이블에 다른 열을 추가하고 삭제 된 = 0 인 레코드 만 표시 할 수 있습니다.

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0

배치되지 않은 행만이 걸리는보기를 만들 수도 있습니다.

CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0

그리고 명령을 삭제하면 다음과 같습니다.

UPDATE TheTable SET deleted = 1 WHERE id = ...

대부분의 상황에서는 삭제 된 행을 삭제 트리거와 함께 아카이브 테이블로 보관합니다. 이렇게하면 각 행을 삭제 한 사람을 캡처 할 수 있으며 삭제 된 행은 내 성능에 영향을 미치지 않습니다. 그런 다음 삭제 된 것들을 포함시키려면 두 테이블을 함께 하나로 묶는 뷰를 만들 수 있습니다.

당신은 그렇게 할 수 있습니다 Lukasz Lysik가 제안합니다, "삭제 된"행의 깃발 역할을하는 필드가있어서 표시를 원하지 않을 때 필터링하십시오. 여러 응용 프로그램에서 사용했습니다.

기존 상태 코드가있는 경우 추가 상태 할당을 추가하는 것이 대체 제안입니다. 예를 들어, 클래스 출석 앱에서 내부적으로 출석 기록을 사용할 수 있습니다. . 그렇게하면 레코드가 있고 문제에 새로운 칼럼을 던지는 것이 아닙니다.

*그것은 무대 뒤에서 사용되는 숫자 코드의 디스플레이 이름입니다. 그냥 명확하게. :)

트리거가있는 솔루션

DB 트리거와 친구라면 다음을 고려할 수 있습니다.

  • ~을 추가하다 DeletedAt and DeletedBy 테이블에 열
  • 각 테이블에 대한보기를 만듭니다 (예 : 테이블 용. Customer 가지고있다 CustomerView 뷰, 가지고있는 행을 걸러내는 view DeletedAt NULL이 아닙니다 (아이디어 GBN 날짜 열로)
  • 모든 CRUD 작업은 평소와 같이 수행하지만 Customer 테이블이지만 CustomerView
  • 추가하다 INSTEAD OF DELETE 물리적으로 삭제하는 대신 행을 삭제로 표시하는 트리거.
    • 이 행에 대한 모든 FK 참조가 여전히 "논리적으로"삭제되도록 보장하는 것처럼 조금 더 복잡한 일을하고 싶을 수도 있습니다. 논리적 참조 무결성

나는 당신 이이 패턴을 사용하기로 선택했을 것입니다. 아마도 내 테이블을 다르게 이름을 지을 것입니다. TCustomer, 그리고 단지 견해 Customer 클라이언트 코드의 명확성을 위해.

Soft Deletes는 참조 무결성을 깨고 사용자 정의 논리를 사용하여 엔터티의 무결성을 시행해야하므로 이러한 종류의 구현에주의하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top