다음을 통해 공유


FileTable과 기타 SQL Server 기능 간 호환성

적용 대상: SQL Server

FileTable이 SQL Server의 다른 기능과 함께 작동하는 방식에 대해 설명합니다.

AlwaysOn 가용성 그룹과 FileTable

FILESTREAM 또는 FileTable 데이터를 포함하는 데이터베이스가 Always On 가용성 그룹에 속할 때:

  • FileTable 기능은 Always On 가용성 그룹에서 부분적으로 지원됩니다. 장애 조치(failover)를 취한 후에는 FileTable 데이터는 주 복제본(replica)에서 엑세스를 할 수 있지만 읽을 수 있는 보조 복제본에서는 FileTable 데이터에 엑세스할 수가 없습니다.

    참고 항목

    장애 조치(failover)를 취한 후 모든 FILESTREAM 기능이 지원됩니다. FILESTREAM 데이터는 읽을 수 있는 보조 복제본(replica) 및 새 주 데이터베이스에 모두 액세스할 수 있습니다.

  • FILESTREAM 및 FileTable 함수가 컴퓨터 이름 대신 VNN(가상 네트워크 이름)을 사용하거나 반환합니다. 이러한 함수에 대한 자세한 내용은 Filestream 및 FileTable 함수(Transact-SQL)를 참조해 주세요.

  • 파일 시스템 API를 통해서 FILESTREAM 또는 FileTable 데이터에 대한 모든 액세스에는 컴퓨터 이름 대신에 VNN을 사용해야만 합니다. 자세한 내용은 Always On 가용성 그룹과 함께 FILESTREAM 및 FileTable 사용을 참조하세요.

분할과 FileTable

FileTable에서는 분할이 지원되지 않습니다. 여러 FILESTREAM 파일 그룹을 지원하므로 대부분의 시나리오에서 분할에 의존하지 않고도 순수 확장 문제를 처리할 수 있습니다(SQL 2008 FILESTREAM과 달리).

복제 및 FileTable

복제 및 관련 기능(트랜잭션 복제, 병합 복제, 변경 데이터 캡처 및 변경 내용 추적 포함)은 FileTable에서 지원되지 않습니다.

트랜잭션 의미 체계 및 FileTable

Windows 애플리케이션

Windows 애플리케이션은 데이터베이스 트랜잭션을 이해하지 못하므로 Windows 쓰기 작업은 데이터베이스 트랜잭션의 ACID 속성을 제공하지 않습니다. 따라서 Windows 업데이트 작업에서는 트랜잭션 롤백 및 복구를 수행할 수 없습니다.

Transact-SQL 애플리케이션

FileTable의 FILESTREAM(file_stream) 열에서 작업하는 Transact-SQL 애플리케이션의 경우 격리 의미 체계는 일반 사용자 테이블의 FILESTREAM 데이터 형식과 동일합니다.

쿼리 알림 및 FileTable

쿼리는 WHERE 절 또는 쿼리의 다른 부분에 있는 FileTable의 FILESTREAM 열에 대한 참조를 포함할 수 없습니다.

SELECT INTO 및 FileTables

FileTable에서 실행된 SELECT INTO 문은 일반적인 테이블의 FILESTREAM 열과 마찬가지로 만들어진 대상 테이블의 FileTable 의미 체계를 전파하지 않습니다. 모든 대상 테이블 열은 일반 열처럼 동작합니다. 연결된 FileTable 의미 체계가 없습니다.

트리거와 FileTable

DDL(데이터 정의 언어) 트리거

DDL 트리거의 경우 FileTable과 관련하여 특별히 고려해야 할 사항이 없습니다. 일반 DDL 트리거는 FileTable에 대한 CREATE/ALTER TABLE 작업뿐만 아니라 데이터베이스 만들기/변경 작업에 대해 발생합니다. 트리거는 EVENTDATA() 함수를 호출하여 DDL 명령 텍스트 및 기타 정보를 포함하는 실제 이벤트 데이터를 검색할 수 있습니다. 기존 Eventdata 스키마에는 새 이벤트 또는 변경 내용이 없습니다.

DML(데이터 조작 언어) 트리거

트리거를 만드는 DDL 작업 중에는 다음과 같은 제한 사항이 적용됩니다.

  • FileTable은 DML 작업에 대한 INSTEAD OF 트리거를 지원하지 않습니다. 이는 FILESTREAM 열이 포함된 모든 테이블에 적용되던 기존 제한 사항입니다.

  • FileTables는 DML 작업에 대한 AFTER 트리거를 지원합니다.

  • FileTable에 정의된 트리거는 부모 FileTable을 포함하여 모든 FileTable을 업데이트할 수 없습니다. 이 제한은 주로 트리거가 동일한 트랜잭션에서 파일 시스템 액세스에 의해 보유된 잠금과 충돌하는 것을 방지하기 위해 존재합니다.

비트랜잭션 액세스 및 트리거에 미치는 영향

  • 데이터베이스에서 트랜잭션이 아닌 업데이트 액세스가 허용되는 경우 해당 데이터베이스의 FileTable을 포함하여 모든 테이블의 FILESTREAM 데이터를 현재 위치로 업데이트할 수 있습니다. 이 가능성으로 인해 FILESTREAM 콘텐츠의 이전 이미지를 트리거에서 사용할 수 없을 수 있습니다.

  • 파일 시스템을 통한 비 트랜잭션 업데이트 작업의 경우 SQL Server는 CloseHandle 작업을 캡처하는 내부 트랜잭션을 만들고 정의된 DML 트리거는 해당 트랜잭션의 일부로 발생할 수 있습니다. 트리거 본문 내부의 트랜잭션에 대한 롤백은 금지되지는 않지만 FILESTREAM의 변경 내용은 롤백되지 않습니다. 이러한 롤백은 FILESTREAM 콘텐츠가 변경된 경우에도 업데이트 트리거가 발생하지 않도록 할 수 있습니다.

  • 이러한 영향 외에도 FileTable의 트리거는 몇 가지 추가 동작을 처리해야 합니다.

    • 파일 시스템을 통해 FileTable에서 트랜잭션이 아닌 업데이트 작업을 사용하면 FILESTREAM 콘텐츠가 다른 Win32 작업에 의해 단독으로 잠글 수 있으며 트리거 본문을 통해 읽기/쓰기에 액세스할 수 없을 수 있습니다. 이러한 경우 트리거 본문 내의 FILESTREAM 콘텐츠에 액세스하려고 하면 "공유 위반" 오류가 발생할 수 있습니다. 트리거는 이러한 오류를 적절하게 처리하도록 설계되어야 합니다.

    • FILESTREAM의 AFTER 이미지는 파일 시스템 액세스에서 허용되는 공유 모드로 인해 다른 비 트랜잭션 업데이트에서 동시에 적극적으로 작성될 수 있으므로 안정적이지 않을 수 있습니다.

  • 관리자 또는 데이터베이스 크래시에 의한 Win32 핸들의 명시적 종료와 같은 Win32 핸들의 비정상적인 종료는 FILESTREAM 콘텐츠가 비정상적으로 종료된 Win32 애플리케이션에 의해 변경되었을 수 있더라도 복구 작업 중에 사용자 트리거를 실행하지 않습니다.

보기 및 FileTable

다른 테이블과 마찬가지로 FileTable에서 보기를 만들 수 있습니다. 그러나 FileTable에서 만든 보기에는 다음 고려 사항이 적용됩니다.

  • 보기에는 FileTable 의미 체계가 있을 수 없습니다. 즉, 뷰의 열(파일 특성 열 포함)은 특별한 의미 체계가 없는 일반 보기 열처럼 동작하며 파일/디렉터리를 나타내는 행도 마찬가지입니다.

  • "업데이트 가능한 뷰" 의미 체계에 따라 뷰를 업데이트할 수 있지만 테이블에서와 마찬가지로 기본 테이블 제약 조건에 따라 업데이트가 거부될 수 있습니다.

  • 파일의 경로를 뷰의 명시적 열로 추가하여 뷰에 시각화할 수 있습니다. 예시:

    CREATE VIEW MP3FILES AS SELECT column1, column2, ..., GetFileNamespacePath() AS PATH, column3,... FROM Documents

인덱싱된 뷰

현재 인덱싱된 뷰에는 FILESTREAM 열 또는 FILESTREAM 열에 의존하는 계산/지속형 계산 열이 포함될 수 없습니다. 이 동작은 FileTable에 정의된 뷰에서도 변경되지 않습니다.

스냅샷 격리와 FileTable

RCSI(커밋된 스냅샷 격리) 및 SI(스냅샷 격리)는 데이터에서 업데이트 작업이 수행되는 경우에도 판독기에서 사용할 수 있는 데이터의 스냅샷을 가질 수 있는 기능을 사용합니다. 그러나 FileTable을 사용하면 Filestream 데이터에 대한 비트랜잭션 쓰기 액세스가 허용됩니다. 따라서 FileTable이 포함된 데이터베이스의 이러한 기능에는 다음과 같은 제한 사항이 적용됩니다.

  • FileTable이 포함된 데이터베이스를 변경하여 RCSI/SI를 사용하도록 설정할 수 있습니다.

  • 데이터베이스에 대해 비트랜잭션 액세스가 FULL로 설정된 경우 트랜잭션이 RCSI에서 실행되거나 SI가 다음과 같이 동작합니다.

    • FileTable file_stream 열의 Transact-SQL 읽기가 실패합니다. file_stream 열에서 읽지 않는 한 열에 대한 INSERT 및 UPDATE는 여전히 성공합니다.

    • Transact-SQL 문에서 READCOMMITTEDLOCK 테이블 힌트를 지정하면 행 버전 관리 대신 읽기가 성공하고 행에 대한 잠금이 수행됩니다.

    • 트랜잭션된 Win32 FileStream 열기 요청도 실패합니다.

    • 트랜잭션되지 않은 FileTable Win32 액세스가 성공합니다. FileTable에서 수행한 모든 내부 쿼리는 영향을 받지 않습니다.

    • 전체 텍스트 인덱싱은 데이터베이스 옵션(READ_COMMITTED_SNAPSHOT 또는 ALLOW_SNAPSHOT_ISOLATION)에 관계없이 항상 성공합니다.

읽기 가능한 보조 데이터베이스

이전 섹션인 스냅샷 격리 및 FileTable에 설명된 대로 읽기 가능한 보조 데이터베이스에도 동일한 고려 사항이 적용됩니다.

포함된 데이터베이스 및 FileTable

FileTable 기능이 종속되는 FILESTREAM 기능을 사용하려면 데이터베이스 외부에서의 몇 가지 구성이 필요합니다. 따라서 FILESTREAM 또는 FileTable을 사용하는 데이터베이스는 완전히 포함되지 않습니다.

포함된 사용자와 같은 포함된 데이터베이스의 특정 기능을 사용하려는 경우 데이터베이스 포함을 PARTIAL으로 설정할 수 있습니다. 그러나 이 경우 일부 데이터베이스 설정은 데이터베이스에 포함되지 않으며 데이터베이스가 이동할 때 자동으로 이동되지 않습니다.