יצירה וניהול של תצוגות

בדף הזה מוסבר איך ליצור ולנהל תצוגות של 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';