문제

이 데이터베이스의 구조에 따라 큰 코드베이스가 있는 mssql2005의 거대한 데이터베이스입니다.

나는 약 10개의 비슷한 테이블을 갖고 있는데, 모두 파일 이름이나 파일의 전체 경로를 포함하고 있습니다.전체 경로는 항상 항목 ID에 따라 달라지므로 데이터베이스에 저장하는 것은 의미가 없습니다.이 테이블에서 유용한 데이터를 얻는 방법은 다음과 같습니다.

SELECT a.item_id
, a.filename
FROM (
    SELECT id_item AS item_id
    , path AS filename
    FROM xMedia

    UNION ALL

    -- media_path has a different collation
    SELECT item_id AS item_id
    , (media_path COLLATE SQL_Latin1_General_CP1_CI_AS) AS filename
    FROM yMedia

    UNION ALL

    -- fullPath contains more than just the filename
    SELECT itemId AS item_id
    , RIGHT(fullPath, CHARINDEX('/', REVERSE(fullPath))-1) AS filename
    FROM zMedia

    -- real database has over 10 of these tables
) a

이 데이터 재해를 사용하는 새 코드가 모든 다른 미디어 테이블에 대해 알 필요가 없도록 이러한 모든 테이블에 대한 단일 보기를 만들고 싶습니다.또한 삽입 및 업데이트 문에 이 뷰를 사용하고 싶습니다.분명히 오래된 코드는 여전히 최신 상태를 유지하기 위해 테이블에 의존합니다.

msdn 페이지를 읽은 후 mssql2005에서 뷰 생성 SCHEMABINDING을 사용하는 뷰로는 충분하지 않다고 생각합니다.

업데이트 가능한 뷰를 어떻게 생성합니까?

이 길이 맞는 걸까요?

도움이 되었습니까?

해결책

특정 조건을 충족하는 경우 분할된 뷰를 수정할 수 있습니다.

이러한 조건에는 다음이 포함됩니다. partitioning column 각 테이블의 기본 키의 일부로 분할 열에 대해 겹치지 않는 검사 제약 조건을 설정합니다.

이것은 귀하의 경우가 아닌 것 같습니다.

귀하의 경우 다음 중 하나를 수행할 수 있습니다.

  • 레거시 소프트가 작동할 수 있도록 테이블을 뷰(계산 열 포함)로 다시 생성하고 새 소프트에서 전체 테이블을 참조하세요.
  • 사용 INSTEAD OF 테이블을 업데이트하기 위해 트리거됩니다.

다른 팁

링크 한 페이지를 아래로 스크롤하면 업데이트 가능한보기에 대한 단락이 표시됩니다. 다른 한계 중에서 노조에 따라보기를 업데이트 할 수 없습니다. 이 배후의 논리는 아마도 간단 할 것입니다. SQL Server는 업데이트/삽입물을 수신 해야하는 소스 테이블/보기를 어떻게 결정해야합니까?

보기가 여러 기본 테이블을 기반으로하는 경우 뷰의 업데이트 문은 업데이트 문에 따라 작동하거나 작동하지 않을 수도 있습니다. 업데이트 문이 여러 기본 테이블에 영향을 미치면 SQL Server가 오류를 던집니다. 반면, 업데이트가보기에서 하나의 기본 테이블에만 영향을 미치는 경우 업데이트는 작동합니다 (항상 올바르게 아님). 삽입 및 삭제 명령문은 항상 실패합니다.

트리거 대신 여러 기본 테이블을 기반으로 한보기에서 올바르게 업데이트, 삽입 및 삭제하는 데 사용됩니다. 다음 링크에는 동일한 비디오 자습서와 함께 예제가 있습니다.

트리거를 삽입하는 대신
업데이트 트리거 대신
트리거를 삭제하는 대신

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