Membuat dan mengelola tampilan

Halaman ini menjelaskan cara membuat dan mengelola tampilan Spanner. Untuk informasi selengkapnya tentang tampilan Spanner, lihat Tentang tampilan.

Izin

Untuk membuat, memberikan, dan mencabut akses ke tampilan, Anda harus memiliki izin spanner.database.updateDdl.

Membuat tampilan

Untuk membuat tampilan, gunakan pernyataan DDL CREATE VIEW untuk memberi nama tampilan dan memberikan kueri yang menentukannya. Pernyataan ini memiliki dua bentuk:

  • CREATE VIEW menentukan tampilan baru dalam database saat ini. Jika tampilan bernama view_name sudah ada, pernyataan CREATE VIEW akan gagal.

  • CREATE OR REPLACE VIEW menentukan tampilan baru dalam database saat ini. Jika tampilan bernama view_name sudah ada, definisinya akan diganti.

Sintaks untuk pernyataan CREATE VIEW adalah:

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

Karena tampilan adalah tabel virtual, query yang Anda tentukan harus memberikan nama untuk semua kolom dalam tabel virtual tersebut.

Selain itu, Spanner memeriksa query yang Anda tentukan menggunakan resolusi nama yang ketat, yang berarti semua nama objek skema yang digunakan dalam kueri harus memenuhi syarat sehingga secara jelas mengidentifikasi satu objek skema. Misalnya, dalam contoh yang mengikuti kolom SingerId dalam tabel Singers harus memenuhi syarat sebagai Singers.SingerId.

Anda harus menentukan SQL SECURITY sebagai INVOKER atau DEFINER dalam pernyataan CREATE VIEW atau CREATE OR REPLACE VIEW. Untuk informasi selengkapnya tentang perbedaan antara kedua jenis keamanan tersebut, lihat Tentang tampilan.

Misalnya, asumsikan tabel Singers ditentukan sebagai berikut:

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
);

Anda dapat menentukan tampilan SingerNames dengan hak invoker sebagai berikut:

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

Tabel virtual yang dibuat saat tampilan SingerNames digunakan dalam kueri memiliki dua kolom, SingerId dan Name.

Meskipun valid, definisi tampilan SingerNames ini tidak mematuhi praktik terbaik mentransmisikan jenis data untuk memastikan stabilitas di seluruh perubahan skema, seperti yang dijelaskan di bagian berikutnya.

Praktik terbaik saat membuat tampilan

Untuk meminimalkan kebutuhan untuk memperbarui definisi tampilan, transmisikan jenis data semua kolom tabel secara eksplisit dalam kueri yang menentukan tampilan tersebut. Saat Anda melakukannya, definisi tampilan dapat tetap valid di seluruh perubahan skema menjadi jenis kolom.

Misalnya, definisi tampilan SingerNames berikut mungkin menjadi tidak valid akibat perubahan jenis data kolom dalam tabel Singers.

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

Anda dapat menghindari tampilan menjadi tidak valid dengan mentransmisikan kolom secara eksplisit ke jenis data yang diinginkan, seperti berikut:

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;

Memberikan dan mencabut akses ke tampilan

Sebagai pengguna kontrol akses yang mendetail, Anda harus memiliki hak istimewa SELECT pada tampilan. Untuk memberikan hak istimewa SELECT di tampilan ke peran database:

GoogleSQL

GRANT SELECT ON VIEW SingerNames TO ROLE Analyst;

PostgreSQL

GRANT SELECT ON TABLE SingerNames TO Analyst;

Untuk mencabut hak istimewa SELECT pada tampilan dari peran database:

GoogleSQL

REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;

PostgreSQL

REVOKE SELECT ON TABLE SingerNames FROM Analyst;

Membuat kueri tampilan

Cara untuk meminta hak invoker atau tampilan hak {i>definer<i} adalah sama. Namun, bergantung pada jenis keamanan tampilan, Spanner mungkin atau mungkin tidak perlu memeriksa objek skema yang dirujuk dalam tampilan berdasarkan peran database akun utama yang memanggil kueri.

Mengkueri tampilan hak invoker

Jika tampilan memiliki hak invoker, pengguna harus memiliki hak istimewa di semua objek skema dasar tampilan tersebut agar dapat mengkuerinya.

Misalnya, jika peran database memiliki akses ke semua objek yang direferensikan oleh tampilan SingerNames, peran tersebut dapat mengkueri tampilan SingerNames:

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

Mengkueri tampilan hak pendefinisian

Jika tampilan memiliki hak pendefinisi, pengguna dapat mengkueri tampilan tanpa memerlukan hak istimewa pada objek pokok selama Anda memberikan hak istimewa SELECT pada tampilan yang diperlukan kepada peran yang diperlukan.

Pada contoh berikut, pengguna dengan peran database Analis ingin membuat kueri tampilan SingerNames. Namun, akses pengguna ditolak karena SingerNames adalah tampilan hak invoker dan peran Analis tidak memiliki akses ke semua objek yang mendasarinya. Dalam hal ini, jika memutuskan untuk memberi Analis akses ke tampilan, tetapi tidak ingin memberinya akses ke tabel Singers, Anda dapat mengganti jenis keamanan tampilan dengan hak penentu. Setelah Anda mengganti jenis keamanan tampilan, berikan akses peran Analis ke tampilan tersebut. Pengguna sekarang dapat membuat kueri tampilan SingerNames meskipun mereka tidak memiliki akses ke tabel Singers.

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

Mengganti tampilan

Anda dapat mengganti tampilan menggunakan pernyataan CREATE OR REPLACE VIEW untuk mengubah definisi tampilan atau jenis keamanan tampilan.

Mengganti tampilan mirip dengan meletakkan dan membuat ulang tampilan. Setiap pemberian akses yang diberikan ke tampilan awal harus diberikan lagi setelah mengganti tampilan.

Untuk mengganti tampilan hak invoker dengan tampilan hak pendefinisi:

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

Menghapus tampilan

Setelah tampilan dihapus, peran database dengan hak istimewa di dalamnya tidak lagi memiliki akses. Untuk menghapus tampilan, gunakan pernyataan DROP VIEW.

DROP VIEW SingerNames;

Mendapatkan informasi tentang tampilan

Anda bisa mendapatkan informasi tentang tampilan dalam database dengan membuat kueri tabel dalam skema INFORMATION_SCHEMA.

  • Tabel INFORMATION_SCHEMA.TABLES menyediakan nama semua tampilan yang ditentukan.

  • Tabel INFORMATION_SCHEMA.VIEWS memberikan nama, definisi tampilan, jenis keamanan, dan teks kueri dari semua tampilan yang ditentukan. Pengguna FGAC yang memiliki hak istimewa SELECT pada tampilan dapat memperoleh informasi tentang tampilan dari tabel INFORMATION_SCHEMA.VIEWS. Pengguna FGAC lainnya memerlukan peran spanner_info_reader jika tidak memiliki hak istimewa SELECT untuk melihat tampilan tersebut.

Untuk memeriksa definisi tampilan dan jenis keamanan tampilan yang disebut ProductSoldLastWeek:

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