בדף הזה מוסבר איך ליצור ולנהל תצוגות של Spanner למסדי נתונים בניב GoogleSQL ולמסדי נתונים בניב PostgreSQL. מידע נוסף על תצוגות ב-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 שאתם מציינים באמצעות פתרון שמות מחמיר, כלומר כל שמות האובייקטים של הסכימה שמשמשים בשאילתה חייבים להיות מוסמכים כך שהם יזהו באופן חד-משמעי אובייקט סכימה יחיד. לדוגמה, בדוגמאות הבאות, העמודה SingerId בטבלה Singers צריכה להיות מוגדרת כ-Singers.SingerId.
צריך לציין את SQL SECURITY בתור INVOKER או DEFINER בהצהרה CREATE VIEW או CREATE OR REPLACE VIEW. מידע נוסף על ההבדל בין שני סוגי האבטחה זמין במאמר סקירה כללית על תצוגות.
לדוגמה, נניח שהטבלה 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, תוכלו להחליף את סוג האבטחה של התצוגה ל'הרשאות של יוצר התצוגה'. אחרי שמחליפים את סוג האבטחה של התצוגה המפורטת, מעניקים לתפקיד 'אנליסט' גישה לתצוגה המפורטת. המשתמש יכול עכשיו לשלוח שאילתה לתצוגה SingerNames גם אם אין לו גישה לטבלה Singers.
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בטבלה מופיעים השמות, הגדרת התצוגה, סוג האבטחה וטקסט השאילתה של כל התצוגות המוגדרות. משתמשים ב-FGAC שיש להם הרשאתSELECTבתצוגה מפורטת יכולים לקבל מידע על התצוגה מהטבלהINFORMATION_SCHEMA.VIEWS. משתמשים אחרים ב-FGAC צריכים את התפקידspanner_info_readerאם אין להם הרשאהSELECTלתצוגה המפורטת.
כדי לבדוק את הגדרת התצוגה ואת סוג האבטחה של תצוגה שנקראת
ProductSoldLastWeek:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';