• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 1. 데이터 정의 문
    1. ALTER DATABASE 구문
    2. ALTER EVENT 구문
    3. ALTER LOGFILE GROUP 구문
    4. ALTER FUNCTION 구문
    5. ALTER PROCEDURE 구문
    6. ALTER SERVER 구문
    7. ALTER TABLE 구문
    8. ALTER TABLESPACE 구문
    9. ALTER VIEW 구문
    10. REATE DATABASE 구문
    11. CREATE EVENT 구문
    12. CREATE FUNCTION 구문
    13. CREATE INDEX 구문
    14. CREATE LOGFILE GROUP 구문
    15. CREATE PROCEDURE 및 CREATE FUNCTION 구문
    16. CREATE SERVER 구문
    17. CREATE TABLE 구문
    18. CREATE TABLESPACE 구문
    19. CREATE TRIGGER 구문
    20. CREATE VIEW 구문
    21. DROP DATABASE 구문
    22. DROP EVENT 구문
    23. DROP FUNCTION 구문
    24. DROP INDEX 구문
    25. DROP LOGFILE GROUP 구문
    26. DROP PROCEDURE 및 DROP FUNCTION 구문
    27. DROP SERVER 구문
    28. DROP TABLE 구문
    29. DROP TABLESPACE 구문
    30. DROP TRIGGER 구문
    31. DROP VIEW 구문
    32. RENAME TABLE 구문
    33. TRUNCATE TABLE 구문
    2. 데이터 조작 문
    3. MySQL 트랜잭션과 잠금 문
    4. 복제 문
    5. Prepared Statements위한 SQL 구문
    6. MySQL 복합문 구문
    7. 데이터베이스 관리 문
    8. MySQL 유틸리티 문
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

13.1.20 CREATE VIEW 구문

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { user | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_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 t​​hen
   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 "업데이트 가능 및 삽입 가능한 뷰" 를 참조하십시오.

서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved