13.1.20 CREATE VIEW 구문
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = {user
| CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEWview_name
[(column_list
)] ASselect_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
CREATE VIEW
문은 새로운 뷰를 작성하거나 OR REPLACE
절이 지정된 경우 기존 뷰를 대체합니다. 뷰가 존재하지 않는 경우, CREATE OR REPLACE VIEW
는 CREATE VIEW
와 동일합니다. 뷰가 존재하는 경우, CREATE OR REPLACE VIEW
는 ALTER VIEW
와 동일합니다.
select_statement
는 뷰의 정의를 제공하는 SELECT
문입니다. (보기에서 선택하면 사실상 SELECT
문을 사용하여 선택한 것입니다.) select_statement
는 기본 테이블 또는 다른보기에서 선택할 수 있습니다.
뷰 정의는 생성시에 "고정"되므로 기본이되는 테이블의 후속 변경은 뷰 정의에 영향을주지 않습니다. 예를 들어, 뷰가 테이블에서 SELECT *
로 정의되어있는 경우 나중에 테이블에 추가 된 새로운 컬럼은 뷰의 일부가되지 않습니다.
ALGORITHM
절은 MySQL에 의한 뷰의 처리 방법에 영향을 미칩니다. DEFINER
및 SQL SECURITY
절은 뷰 호출시에 접근 권한을 확인하는 데 사용되는 보안 컨텍스트를 지정합니다. WITH CHECK OPTION
절을 지정하면 뷰에서 참조되는 테이블의 행에 삽입 또는 갱신을 제한 할 수 있습니다. 이 절은이 섹션의 나머지 부분에서 설명되어 있습니다.
CREATE VIEW
문이 뷰에 대한 CREATE VIEW
권한과 SELECT
문에 의해 선택된 각 컬럼에 대한 어떤 권한이 필요합니다. SELECT
문 내의 다른 위치에서 사용되는 컬럼에 대해서는 SELECT
권한이 필요합니다. OR REPLACE
절이 있으면이보기에 대한 DROP
권한도 필요합니다. 이 섹션의 나머지 부분에서 설명 된 바와 같이, DEFINER
값에 따라 CREATE VIEW
에 SUPER
권한이 필요할 수 있습니다.
뷰가 참조되면이 섹션의 나머지 부분에서 설명되는 권한 확인이 발생합니다.
뷰는 데이터베이스에 속합니다. 기본적으로 새보기는 기본 데이터베이스에 생성됩니다. 뷰를 명시 적으로 특정 데이터베이스에 만들려면 뷰를 만들 때 그 이름을 db_name.view_name
로 지정합니다.
mysql> CREATE VIEW test.v AS SELECT * FROM t;
데이터베이스에서 기본 테이블과 뷰는 같은 네임 스페이스를 공유하기 위해 기본 테이블과 뷰가 같은 이름을 가질 수 없습니다.
SELECT
문에 의해 취득되는 컬럼은 테이블 컬럼에 대한 단순 참조 할 수 있습니다. 또한, 함수, 상수, 연산자 등을 사용하여 식으로 할 수 있습니다.
뷰는 기본 테이블과 마찬가지로 고유 한 고유의 컬럼 이름을 가져야합니다. 기본적으로 SELECT
문으로 확보되는 컬럼의 이름은 뷰 컬럼 이름에 사용됩니다. 뷰 컬럼의 명시적인 이름을 정의하려면 옵션 column_list
절을 쉼표로 구분 된 식별자 목록으로 지정할 수 있습니다. column_list
의 이름의 수는 SELECT
문으로 확보되는 컬럼의 수와 동일해야합니다.
SELECT
문에서 규정되지 않은 테이블 또는 뷰 이름은 기본 데이터베이스를 기준으로 해석됩니다. 뷰는 테이블 또는 뷰 이름을 적절한 데이터베이스 이름으로 규정함으로써 다른 데이터베이스의 테이블 또는 뷰를 참조 할 수 있습니다.
뷰는 많은 종류의 SELECT
문에서 만들 수 있습니다. 기본 테이블 또는 다른 뷰를 참조 할 수 있습니다. 조인 UNION
및 서브 쿼리를 사용할 수 있습니다. SELECT
테이블을 전혀 참조하지 않아도 괜찮습니다. 다음 예제에서는 다른 테이블에서 두 컬럼에 추가하고 그 열에서 계산되는 식을 선택하는 뷰를 정의하고 있습니다.
mysql>CREATE TABLE t (qty INT, price INT);
mysql>INSERT INTO t VALUES(3, 50);
mysql>CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql>SELECT * FROM v;
+------+-------+-------+ | qty | price | value | +------+-------+-------+ | 3 | 50 | 150 | +------+-------+-------+
뷰 정의는 다음 제한에 따릅니다.
SELECT
문에FROM
절의 서브 쿼리를 포함 할 수 없습니다.SELECT
문은 시스템 또는 사용자 변수를 참조 할 수 없습니다.저장 프로그램에서이 정의는 프로그램 파라미터 또는 로컬 변수를 참조 할 수 없습니다.
SELECT
문은 준비된 명령문의 매개 변수를 참조 할 수 없습니다.이 정의에서 참조되는 테이블 또는 뷰는 모든 존재해야합니다. 그러나 뷰가 작성된 후에는이 정의에서 참조되는 테이블 또는 뷰를 삭제할 수 있습니다. 이 경우이보기를 사용하면 오류가 발생합니다. 이 유형의 문제에 관해서 뷰 정의를 확인하려면
CHECK TABLE
문을 사용합니다.이 정의는
TEMPORARY
테이블을 참조 할 수 없기 때문에TEMPORARY
뷰를 만들 수 없습니다.뷰 정의에 지정된 테이블은 모든 정의시에 존재해야합니다.
트리거를 뷰에 연결할 수 없습니다.
SELECT
문에서 컬럼 이름의 별칭 (256 자 별명의 최대 길이가 아니라) 64 자 열의 최대 길이에 체크됩니다.
ORDER BY
는 뷰 정의에서 허용되어 있지만 자신의 ORDER BY
를 포함 문을 사용하는 뷰에서 선택한 경우 무시됩니다.
이 정의에서 기타 옵션 또는 어구의 경우 해당 뷰를 참조하는 명령문의 옵션 또는 어구에 추가되지만 그 효과는 정의되어 있지 않습니다. 예를 들어, 뷰 정의에 LIMIT
절이 포함되어있을 때 자신의 LIMIT
절을 포함 문을 사용하는 뷰에서 선택하면 어떤 제한이 적용되는지는 정의되지 않습니다. 이 같은 원칙은 SELECT
키워드 다음에 나오는 ALL
, DISTINCT
, SQL_SMALL_RESULT
등의 옵션과 INTO
, FOR UPDATE
, LOCK IN SHARE MODE
, PROCEDURE
등의 조항에도 적용됩니다.
뷰를 작성한 후 시스템 변수의 변경에 따라 쿼리 처리 환경을 변경하면 해당 뷰에서 얻어지는 결과에 영향을 미칠 수 있습니다.
mysql>CREATE VIEW v (mycol) AS SELECT 'abc';
Query OK, 0 rows affected (0.01 sec) mysql>SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT "mycol" FROM v;
+-------+ | mycol | +-------+ | mycol | +-------+ 1 row in set (0.01 sec) mysql>SET sql_mode = 'ANSI_QUOTES';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT "mycol" FROM v;
+-------+ | mycol | +-------+ | abc | +-------+ 1 row in set (0.00 sec)
DEFINER
및 SQL SECURITY
절은 뷰를 참조하는 명령문이 실행될 때 뷰에 대한 액세스 권한을 확인하는 데 사용할 MySQL 계정을 사용할지 여부를 결정합니다. SQL SECURITY
특성의 유효한 값은 DEFINER
와 INVOKER
입니다. 이들은 각각 해당 뷰를 정의한 사용자 또는 호출 한 사용자가 필요한 권한을 가지고있을 필요가 있음을 나타냅니다. SQL SECURITY
의 기본값은 DEFINER
입니다.
DEFINER
절에 user
값을 지정하려면 '
( user_name
'@' host_name
'GRANT
문에 사용되는 것과 같은 형식), CURRENT_USER
또는 CURRENT_USER()
로 지정된 MySQL 계정하도록하십시오. DEFINER
의 기본값은 CREATE VIEW
문을 실행하는 사용자입니다. 이것은 명시 적으로 DEFINER = CURRENT_USER
를 지정하는 것과 동일합니다.
DEFINER
절을 지정한 경우 다음의 규칙에 따라 유효한 DEFINER
사용자 값이 결정됩니다.
SUPER
권한이없는 경우 유효한 유일한user
값은 리터럴로 지정하거나CURRENT_USER
를 사용하여 지정한 계정입니다. 정의들을 다른 계정으로 설정할 수 없습니다.SUPER
권한이 있으면 구문으로 유효한 계정 이름을 지정할 수 있습니다. 계정이 실제로 존재하지 않는 경우 경고가 생성됩니다.존재하지 않는
DEFINER
계정으로 뷰를 만들 수 있지만SQL SECURITY
값이DEFINER
이지만, 정의 계정이 존재하지 않는 경우는 뷰가 참조 될 때 오류가 발생합니다.
뷰의 보안 자세한 내용은 섹션 20.6 "저장 프로그램 및 뷰의 액세스 제어" 를 참조하십시오.
뷰 정의에서 CURRENT_USER
는 기본적으로 뷰의 DEFINER
값을 반환합니다. SQL SECURITY INVOKER
특성을 사용하여 정의 된 뷰의 경우 CURRENT_USER
는 뷰 호출자 계정을 반환합니다. 보기에서 사용자 감사 내용은 섹션 6.3.13 "SQL 기반의 MySQL 계정 활동 감사" 를 참조하십시오.
SQL SECURITY DEFINER
특성을 사용하여 정의 된 스토어드 루틴 내에서 CURRENT_USER
그 루틴 DEFINER
값을 반환합니다. 뷰 정의에 CURRENT_USER
의 DEFINER
값이 포함되어 있다면, 이는 이러한 루틴에 정의 된 뷰도 영향을받습니다.
뷰의 권한은 다음과 같이 확인됩니다.
뷰 정의시 뷰 작성자는 그 뷰를 통해 액세스되는 최상위 개체를 사용하는 데 필요한 권한을 가지고 있어야합니다. 예를 들어, 뷰 정의가 테이블 컬럼을 참조하는 경우 제작자는 그 정의의 선택 목록의 각 컬럼에 대한 어떠한 권한과 정의의 다른 장소에서 사용되는 각 컬럼에 대한
SELECT
권한을 가지고 있어야합니다. 이 정의가 저장 함수를 참조하는 경우 해당 함수를 호출하는 데 필요한 권한 만 확인할 수 있습니다. 함수 호출시에 필요한 권한은 함수가 실행될 때 밖에 볼 수 없습니다. 다른 호출은 함수의 다른 실행 경로가 선택 될 가능성이 있습니다.뷰를 참조하는 사용자는 뷰에 액세스하기위한 적절한 권한 (뷰에서 선택하는
SELECT
이나 뷰에 삽입하는INSERT
등)을 가지고 있어야합니다.뷰가 참조되면 그 뷰를 통해 액세스되는 객체에 대한 권한이
SQL SECURITY
특성이DEFINER
또는INVOKER
인지 여부에 따라 각각 그 뷰의DEFINER
계정에 의해 유지되는 권한 또는 호출 에 대해 확인됩니다.뷰에 대한 참조로 저장 기능이 실행되는 경우, 그 함수 내에서 실행되는 명령문의 권한 확인은 함수의
SQL SECURITY
특성이DEFINER
또는INVOKER
인지에 따라 달라집니다. 보안 특성이DEFINER
이면 그 함수는DEFINER
계정의 권한으로 실행됩니다. 이 특성이INVOKER
이면 그 함수는 뷰의SQL SECURITY
특성에 의해 결정되는 권한으로 실행됩니다.
예 :있는 뷰가 저장 기능에 의존 할 가능성이 있으며, 그 함수가 다른 스토어드 루틴을 호출 할 수 있습니다. 예를 들어, 다음 뷰는 스토어드 함수 f()
를 호출합니다.
CREATE VIEW v AS SELECT * FROM t WHERE t.id = f (t.name);
f()
에 다음과 같은 문이 포함되어 있다고합니다.
IF name IS NULL then CALL p1 (); ELSE CALL p2 (); END IF;
f()
가 실행될 때, f()
의 문을 실행하는 데 필요한 권한을 확인해야합니다. 이것은 f()
의 실행 경로에 따라 p1()
또는 p2()
에 대한 권한이 필요함을 나타냅니다. 이러한 권한은 실행시에 확인해야 이러한 권한을 가지고 있어야하는 사용자는 뷰 v
와 함수 f()
의 SQL SECURITY
값에 의해 결정됩니다.
뷰의 DEFINER
및 SQL SECURITY
절은 표준 SQL에 대한 확장입니다. 표준 SQL에서는 뷰는 SQL SECURITY DEFINER
규칙을 사용하여 처리됩니다. 표준은 뷰의 정의 자 (이것은 뷰의 스키마의 소유자와 동일합니다)는 그 뷰에 대한 적절한 권한 ( SELECT
)을 얻을 수 있으며 그들을 부여 할 수 있다고 기재되어 있습니다 . MySQL은 스키마의 '소유자'라는 개념이 없기 때문에 MySQL에서 정의들을 식별하기위한 조항이 추가되어 있습니다. DEFINER
절은 표준에서 제공하는 기능, 즉 누가 뷰를 정의했는지에 대한 영구적 인 레코드를 구비하는 것을 목적으로 한 확장입니다. DEFINER
의 기본값이 뷰 작성자의 계정이있는 것은 그 때문입니다.
옵션 ALGORITHM
절은 표준 SQL에 대한 MySQL 확장입니다. 이것은 MySQL에 의한 뷰의 처리 방법에 영향을 미칩니다. ALGORITHM
은 MERGE
, TEMPTABLE
또는 UNDEFINED
의 3 개의 값을받습니다. ALGORITHM
절이 없으면 기본 알고리즘은 UNDEFINED
입니다.자세한 내용은 섹션 20.5.2 "뷰 처리 알고리즘" 을 참조하십시오.
일부 뷰는 갱신 가능합니다. 즉, 이러한 뷰를 UPDATE
, DELETE
, INSERT
등의 문 사용하여 기본이되는 테이블의 내용을 업데이트 할 수 있습니다. 뷰가 업데이트 가능하므로 해당 뷰의 행과 기반이되는 테이블의 행 사이에 일대일 관계가 존재해야합니다. 또한 뷰를 갱신 불가능하게하는 기타 특정 구조 구문도 존재합니다.
갱신 가능한 뷰에 WITH CHECK OPTION
절을 지정하면 select_statement
의 WHERE
절이 true 인 행을 제외한 행의 삽입 또는 갱신을 피할 수 있습니다.
갱신 가능한 뷰에 대한 WITH CHECK OPTION
절은 뷰가 다른 뷰와 관련하여 정의되어있는 경우 LOCAL
및 CASCADED
키워드에 의해 확인 테스트의 범위가 결정됩니다. LOCAL
키워드는 CHECK OPTION
을 정의되는 뷰에만 제한합니다. CASCADED
을 지정하면 기본이되는 뷰에 대한 체크도 평가됩니다. 두 키워드가 지정되지 않은 경우, 디폴트는 CASCADED
됩니다.
갱신 가능한 뷰 및 WITH CHECK OPTION
절 자세한 내용은 섹션 20.5.3 "업데이트 가능 및 삽입 가능한 뷰" 를 참조하십시오.