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 bernamaview_name
sudah ada, pernyataanCREATE VIEW
akan gagal.CREATE OR REPLACE VIEW
menentukan tampilan baru dalam database saat ini. Jika tampilan bernamaview_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 istimewaSELECT
pada tampilan dapat memperoleh informasi tentang tampilan dari tabelINFORMATION_SCHEMA.VIEWS
. Pengguna FGAC lainnya memerlukan peranspanner_info_reader
jika tidak memiliki hak istimewaSELECT
untuk melihat tampilan tersebut.
Untuk memeriksa definisi tampilan dan jenis keamanan tampilan yang disebut
ProductSoldLastWeek
:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';