다음을 통해 공유


뷰를 통해 데이터 수정

UPDATE, INSERT 및 DELETE 문을 사용하거나 bcp 유틸리티와 BULK INSERT 문을 사용하여 테이블의 데이터를 수정하는 것과 같은 방식으로 뷰를 통해 기본 테이블의 데이터를 수정할 수 있습니다. 그러나 다음 제한 사항은 뷰 업데이트에만 적용되고 테이블에는 적용되지 않습니다.

[!참고]

분할 뷰에는 다음 제한 사항 중 일부가 적용되지 않고 INSTEAD OF 트리거를 통해 적용된 업데이트에는 아무 제한 사항도 적용되지 않습니다. 자세한 내용은 이 항목의 뒷부분에 있는 "뷰를 통해 데이터를 수정하기 위한 다른 옵션"을 참조하십시오.

  • UPDATE, INSERT 및 DELETE 문을 비롯한 모든 수정은 하나의 기본 테이블에 있는 열만 참조해야 합니다.

  • 뷰에서 수정하는 열은 테이블 열에 있는 기본 데이터를 직접 참조해야 합니다. 이러한 열은 다음과 같은 방법으로 파생될 수 없습니다.

    • 집계 함수(AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, VARP)

    • 계산. 열은 다른 열을 사용하는 식으로 계산할 수 없습니다. UNION, UNION ALL, CROSSJOIN, EXCEPT, INTERSECT 등의 집합 연산자를 사용하여 작성된 열은 결과적으로 계산이 되며 업데이트 가능하지도 않습니다.

  • 수정 중인 열은 GROUP BY, HAVING 또는 DISTINCT 절의 영향을 받을 수 없습니다.

  • WITH CHECK OPTION이 지정되어 있으면 위치에 관계없이 뷰의 select_statement에 TOP을 사용할 수 없습니다.

이전의 제한이 뷰 자체에 적용되는 것과 마찬가지로 뷰의 FROM 절 하위 쿼리에 적용됩니다. 일반적으로 SQL Server 2008은 뷰 정의에서 한 기본 테이블의 수정 내용을 확실하게 추적할 수 있어야 합니다. 예를 들어 다음 뷰는 업데이트할 수 없습니다.

CREATE VIEW TotalSalesContacts
AS
SELECT C.LastName, 
SUM(O.TotalDue) AS TotalSales
FROM Sales.SalesOrderHeader O, Person.Contact C
WHERE C.ContactID = O.ContactID
GROUP BY LastName

TotalSalesContacts의 LastName 열 수정은 해당 열이 GROUP BY 절의 영향을 받기 때문에 허용되지 않습니다. 같은 성의 항목이 둘 이상인 경우 SQL Server에서는 어떤 성을 업데이트, 삽입 또는 삭제해야 할지 알 수 없습니다. 마찬가지로 TotalSalesContacts의 TotalSales 열을 수정하려고 하면 해당 열이 집계 함수에서 파생된 열이기 때문에 오류가 반환됩니다. SQL Server에서 기본 테이블인 SalesOrderHeader로 직접 이 열을 추적할 수 없습니다.

다음 추가 지침이 적용됩니다.

  • 뷰 정의에 WITH CHECK OPTION 절을 사용할 경우 뷰에 대해 실행되는 모든 데이터 수정 문은 뷰를 정의하는 SELECT 문에 설정된 조건을 따라야 합니다. WITH CHECK OPTION 절을 사용하면 뷰에서 행이 사라지도록 수정할 수 없습니다. 뷰에서 행이 사라지도록 행을 수정하면 수정이 취소되고 오류가 표시됩니다.

  • INSERT 문은 Null 값을 허용하지 않는 기본 테이블의 모든 열에 대한 값을 지정해야 하며 DEFAULT 정의가 없어야 합니다.

  • 기본 테이블의 열에서 수정되는 데이터는 이 열의 Null 허용 여부, 제약 조건, DEFAULT 정의 등의 제한 사항을 따라야 합니다. 예를 들어 행을 삭제하는 경우 관련 테이블의 모든 기본 FOREIGN KEY 제약 조건에 맞아야 삭제가 성공합니다.

  • 분산형 분할 뷰(원격 뷰)는 키 집합 커서를 사용하여 업데이트할 수 없습니다. 이러한 제한 사항은 뷰 자체가 아닌 기본 테이블에서 커서를 선언하여 해결할 수 있습니다.

  • bcp 또는 BULK INSERT 및 INSERT ... SELECT * FROM OPENROWSET(BULK...) 문을 통해 데이터를 분할된 뷰로 대량 가져오기는 지원되지 않습니다. 그러나 INSERT 문을 사용하여 분할된 뷰에 여러 행을 삽입할 수 있습니다. 자세한 내용은 뷰에서 대량 데이터 내보내기 및 대량 데이터 가져오기를 참조하십시오.

  • READTEXT 및 WRITETEXT 문은 뷰에서 text, ntext 또는 image 열과 함께 사용할 수 없습니다.

뷰를 통해 데이터를 수정하기 위한 다른 옵션

이 항목의 앞부분에서 설명한 제한 사항으로 인해 뷰를 통해 직접 데이터를 수정할 수 없는 경우 다음 방법을 사용하십시오.

  • INSTEAD OF 트리거에 INSERT, UPDATE 및 DELETE 문을 지원하는 논리를 사용합니다. 자세한 내용은 INSTEAD OF 트리거 디자인을 참조하십시오.

  • 하나 이상의 멤버 테이블을 수정하는 업데이트 가능한 분할된 뷰를 사용합니다. 자세한 내용은 분할된 뷰 만들기를 참조하십시오.

뷰를 통해 데이터를 추가하려면

뷰를 통해 데이터를 변경하려면

뷰를 통해 데이터를 삭제하려면

참고 항목

개념