뷰 만들기 및 관리

이 페이지에서는 Spanner 뷰를 만들고 관리하는 방법을 설명합니다. Spanner 뷰에 대한 자세한 내용은 뷰 정보를 참조하세요.

권한

뷰에 대한 액세스 권한을 생성, 부여, 취소하려면 spanner.database.updateDdl 권한이 있어야 합니다.

뷰 만들기

뷰를 만들려면 DDL 문 CREATE VIEW를 사용하여 뷰 이름을 지정하고 이를 정의하는 쿼리를 제공합니다. 이 문에는 다음 두 가지 형식이 있습니다.

  • CREATE VIEW는 현재 데이터베이스에 새 뷰를 정의합니다. 이름이 view_name인 뷰가 이미 있으면 CREATE VIEW 문이 실패합니다.

  • CREATE OR REPLACE VIEW는 현재 데이터베이스에 새 뷰를 정의합니다. 이름이 view_name인 뷰가 이미 있으면 해당 정의가 대체됩니다.

CREATE VIEW 문의 구문은 다음과 같습니다.

{CREATE | CREATE OR REPLACE } VIEW  view_name
SQL SECURITY { INVOKER | DEFINER }
AS query

뷰는 가상 테이블이므로 지정하는 query는 해당 가상 테이블의 모든 열 이름을 제공해야 합니다.

또한 Spanner는 엄격한 이름 확인을 사용하여 지정한 query를 확인합니다. 즉, 쿼리에 사용된 모든 스키마 객체 이름은 단일 스키마 객체를 명확하게 식별할 수 있도록 정규화되어야 합니다. 예를 들어 Singers 테이블의 SingerId 열 다음에 나오는 예시에서는 Singers.SingerId로 정규화되어야 합니다.

CREATE VIEW 또는 CREATE OR REPLACE VIEW 문에서 SQL SECURITYINVOKER 또는 DEFINER로 지정해야 합니다. 두 보안 유형의 차이점에 대한 자세한 내용은 뷰 정보를 참조하세요.

예를 들어 Singers 테이블이 다음과 같이 정의되었다고 가정합니다.

GoogleSQL

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX)
) PRIMARY KEY (SingerId);

PostgreSQL

CREATE TABLE Singers (
  SingerId   BIGINT PRIMARY KEY,
  FirstName  VARCHAR(1024),
  LastName   VARCHAR(1024),
  SingerInfo BYTEA
);

다음과 같이 호출자의 권한을 사용하여 SingerNames 뷰를 정의할 수 있습니다.

CREATE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
   Singers.SingerId AS SingerId,
   Singers.FirstName || ' ' || Singers.LastName AS Name
FROM Singers;

쿼리에서 SingerNames 뷰를 사용할 때 생성되는 가상 테이블에는 SingerIdName이라는 두 가지 열이 있습니다.

SingerNames 뷰 정의는 유효하지만, 다음 섹션에 설명된 대로 스키마 변경에 걸쳐 안정성을 보장하기 위해 데이터 유형을 캐스팅하는 권장사항을 따르지 않습니다.

뷰 생성 시 권장사항

뷰의 정의를 업데이트해야 하는 필요성을 최소화하려면 뷰를 정의하는 쿼리에서 모든 테이블 열의 데이터 유형을 명시적으로 변환합니다. 이렇게 하면 열 유형이 변경될 때도 뷰의 정의가 유효할 수 있습니다.

예를 들어SingerNames 뷰의 다음 정의는 Singers 테이블에서 열의 데이터 유형을 변경한 결과로서 유효하지 않게 될 수 있습니다.

CREATE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
   Singers.SingerId AS SingerId,
   Singers.FirstName || ' ' || Singers.LastName AS Name
FROM Singers;

다음과 같이 열을 원하는 데이터 유형으로 명시적으로 캐스팅하여 뷰가 무효화되지 않도록 할 수 있습니다.

GoogleSQL

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
 CAST(Singers.SingerId AS INT64) AS SingerId,
 CAST(Singers.FirstName AS STRING) || " " || CAST(Singers.LastName AS STRING) AS Name
FROM Singers;

PostgreSQL

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
 CAST(Singers.SingerId AS bigint) AS SingerId,
 CAST(Singers.FirstName AS varchar) || ' ' || CAST(Singers.LastName AS varchar) AS Name
FROM Singers;

뷰에 대한 액세스 권한 부여 및 취소

세분화된 액세스 제어 사용자는 뷰에 대한 SELECT 권한이 있어야 합니다. 데이터베이스 역할에 대해 뷰에 대한 SELECT 권한을 부여하려면 다음 안내를 따르세요.

GoogleSQL

GRANT SELECT ON VIEW SingerNames TO ROLE Analyst;

PostgreSQL

GRANT SELECT ON TABLE SingerNames TO Analyst;

데이터베이스 역할에서 뷰에 대한 SELECT 권한을 취소하려면 다음 안내를 따르세요.

GoogleSQL

REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;

PostgreSQL

REVOKE SELECT ON TABLE SingerNames FROM Analyst;

뷰 쿼리

호출자의 권한 또는 정의자의 권한 뷰를 쿼리하는 방법은 동일합니다. 하지만 뷰의 보안 유형에 따라 Spanner는 쿼리를 호출한 주 구성원의 데이터베이스 역할에 대해 뷰에서 참조된 스키마 객체를 확인해야 할 수도, 그렇지 않을 수도 있습니다.

호출자의 권한 뷰 쿼리

뷰에 호출자 권한이 있는 경우 사용자가 뷰를 쿼리하려면 뷰의 모든 기본 스키마 객체에 대한 권한이 있어야 합니다.

예를 들어 데이터베이스 역할이 SingerNames 뷰에서 참조하는 모든 객체에 액세스할 수 있는 경우 SingerNames 뷰를 쿼리할 수 있습니다.

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

정의자의 권한 뷰 쿼리

뷰에 정의자의 권한이 있으면 사용자는 필수 역할에 뷰에 대한 SELECT 권한을 부여하는 한 기본 객체에 대한 권한 없이 뷰를 쿼리할 수 있습니다.

다음 예시에서는 애널리스트 데이터베이스 역할을 가진 사용자가 SingerNames 뷰를 쿼리하려고 합니다. 하지만 SingerNames는 호출자의 권한 뷰이며, 애널리스트 역할은 모든 기본 객체에 대한 액세스 권한이 없기 때문에 사용자의 액세스가 거부됩니다. 이 경우 애널리스트에게 뷰에 대한 액세스 권한을 부여하지만 Singers 테이블에 대한 액세스 권한은 제공하지 않기로 결정하려는 경우 뷰의 보안 유형을 정의자의 권한으로 바꿀 수 있습니다. 뷰의 보안 유형을 대체한 후 분석가 역할에 뷰에 대한 액세스 권한을 부여합니다. 이제 사용자는 Singers 테이블에 대한 액세스 권한이 없더라도 SingerNames 뷰를 쿼리할 수 있습니다.

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

뷰 바꾸기

CREATE OR REPLACE VIEW 문을 사용하여 뷰 정의 또는 뷰의 보안 유형을 변경하여 뷰를 바꿀 수 있습니다.

뷰 교체는 뷰 삭제 및 다시 만들기와 유사합니다. 초기 뷰에 부여된 액세스 권한은 뷰를 대체한 후 다시 부여해야 합니다.

호출자의 권한 뷰를 정의자의 권한 뷰로 바꾸려면 다음 안내를 따르세요.

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY DEFINER
AS SELECT
   Singers.SingerId AS SingerId,
   Singers.FirstName || ' ' || Singers.LastName AS Name
FROM Singers;

뷰 삭제

뷰가 삭제된 후 이에 대한 권한이 있는 데이터베이스 역할은 더 이상 액세스할 수 없습니다. 뷰를 삭제하려면 DROP VIEW 문을 사용합니다.

DROP VIEW SingerNames;

뷰 정보 가져오기

INFORMATION_SCHEMA 스키마의 테이블을 쿼리하여 데이터베이스의 뷰에 대한 정보를 가져올 수 있습니다.

  • INFORMATION_SCHEMA.TABLES 테이블은 정의된 모든 뷰의 이름을 제공합니다.

  • INFORMATION_SCHEMA.VIEWS 테이블은 정의된 모든 뷰의 이름, 뷰 정의, 보안 유형, 쿼리 텍스트를 제공합니다. 뷰에 대한 SELECT 권한이 있는 FGAC 사용자는 INFORMATION_SCHEMA.VIEWS 테이블에서 뷰에 대한 정보를 가져올 수 있습니다. 다른 FGAC 사용자에게 뷰에 대한 SELECT 권한이 없는 경우 spanner_info_reader 역할이 필요합니다.

ProductSoldLastWeek라는 뷰의 뷰 정의와 보안 유형을 확인하려면 다음 안내를 따르세요.

  SELECT *
  FROM INFORMATION_SCHEMA.VIEWS
  WHERE TABLE_NAME = 'ProductSoldLastWeek';