이 페이지에서는 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 SECURITY
를 INVOKER
또는 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
뷰를 사용할 때 생성되는 가상 테이블에는 SingerId
와 Name
이라는 두 가지 열이 있습니다.
이 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';