상위 문서: SQL
개요
모든 유저들이 데이터베이스 내의 모든 logical model(relation)을 볼 수 있는 권한을 가지는 것은 보안상의 측면에서 권장되지 않는다. 또한 어떤 사용자는 특정 릴레이션(relation)에 접근할 수는 있어도, 모든 속성(attribute)에 접근하는 것이 바람직하지 않을 수 있다. 예를 들어, 어떤 직원(employee)는 강사(instructor)의 ID, name, dept_name 속성에 접근할 필요가 있지만, 강사의 salary 속성을 볼 필요는 없을 수 있다. 따라서 해당 직원은 다음과 같은 SQL 쿼리(query)로 표현된 릴레이션에 접근해야 한다.
select ID, name, dept_name from instructor;
즉, 위 쿼리의 결과를 계산하여 저장한 다음 저장된 릴레이션을 사용자에게 제공하는 방식으로 특정 사용자에게 제한된 릴레이션을 제공할 수 있다. 하지만 instructor, course, section 릴레이션 안의 데이터가 변경된다면, 저장된 쿼리 결과는 다시 쿼리를 실행했을 때의 결과와 일치하지 않는다.(out-of-date) 따라서 위와 같은 해결 방식, 즉 쿼리 결과를 계산해서 저장하는 것은 좋은 생각이 아니다.
대신 SQL에는 view라는 기능이 있다. View는 개념적인 모델(conceptual model)에는 없지만 사용자에게 virtual relation으로 보이도록 만든 릴레이션이다. 이를 위해 SQL은 쿼리에 의해 정의되는 virtual relation이라는 기능을 제공한다. Virtual relation은 미리 계산되어 저장되는 것이 아니라, virtual relation이 사용될 때마다 쿼리를 실행하여 계산된다. 이는 with 절과 유사한 기능이다.
즉, 해당 예시에서 view는 원본 릴레이션에 직접적으로 접근할 권한을 부여하지 않는다.[1] 대신 salary 속성이 포함되지 않은 view를 만들고 해당 view에만 직원에게 접근 권한을 부여한다. 따라서 해당 직원은 salary를 제외한 속성만 볼 수 있게 된다.
View definition
SQL에서 view를 정의하기 위해서는 create view 명령어를 사용해야 한다. 또한 view를 정의하기 위해서는 이름을 부여해야 하며, view를 계산할 쿼리를 명시해야 한다. create view 명령어는 v라는 이름의 view를 정의하기 위해 아래와 같이 사용된다.
create view v as <query expression>;
이때 <query expression>는 어떤 쿼리 표현식이라도 문법만 맞다면 가능하다. 이를 활용하여 강사 릴레이션에서 salary 속성을 제외한 모든 속성에 접근하는 직원에게 제공하는 view는 다음과 정의된다.
create view faculty as select ID, name, dept_name from instructor;
위에서 만들어진 faculty라는 view name은 추후에도 해당 view 정의를 통해서 만들어진 virtual relation을 호출하기 위해서 사용될 수 있다. 즉, view는 명시적으로 삭제될 때까지 사용가능하다.[2] 또한, view definition은 위 문단에서 언급했듯이 해당 쿼리를 실행하여 릴레이션을 생성하는 것과는 구별된다. View definition은 단순히 표현식을 저장할 뿐이며, 해당 표현식을 통해 view relation이 필요할 때마다 즉시(on demand) 생성된다.