בדף הזה מוסבר איך בקרת גישה ברמת גרנולריות גבוהה פועלת עם תורים של Spanner למסדי נתונים עם ניב GoogleSQL ולמסדי נתונים עם ניב PostgreSQL.
ב-Spanner, תור מוגדר כאובייקט סכימה. הגישה לשליחת הודעות, לקבלת הודעות, להארכת תקופות השכירות של הודעות, לאישור ומחיקה של הודעות או לשליחת שאילתות ישירות לתורים תואמת לתפקידים ולהרשאות הסטנדרטיים במסד הנתונים של Spanner.
הרשאות לשליחת הודעות (מפיקים)
כדי לשלוח הודעות לתור באמצעות DML (INSERT INTO) או Mutation API (ראו הצהרת Insert), צריך להעניק את ההרשאה INSERT בתור לתפקיד במסד הנתונים:
GoogleSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;
כדי לבטל את ההרשאה:
GoogleSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
הרשאות לקבלת הודעות (צרכנים)
כדי להזרים הודעות מתור, תהליכי עבודה של צרכנים מריצים את הפונקציה RECEIVE_QUEUE_NAME() table-valued function (TVF) עם ExecuteStreamingSQL.
כדי לאפשר לתפקיד במסד הנתונים להזרים הודעות מהתור, צריך להעניק את ההרשאה EXECUTE בפונקציה RECEIVE_QUEUE_NAME שנוצרה באופן אוטומטי:
GoogleSQL
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME TO ROLE_NAME;
כדי לבטל את ההרשאה:
GoogleSQL
REVOKE EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME FROM ROLE_NAME;
כדי להתקשר אל RECEIVE_QUEUE_NAME() צריך רק EXECUTE ב-TVF, ולא צריך SELECT בתור.
הארכת תקופת ההחזקה של הודעות
כשצרכן מקבל הודעה, Spanner מקצה לו חכירה ראשונית של 10 שניות. אם עיבוד ההודעה נמשך יותר זמן מהחכירה הראשונית, צרכן צריך להאריך את החכירה באמצעות TVF RENEWLEASE_QUEUE_NAME().
כדי להאריך את תקופת ההחזקה, התפקיד צריך לכלול את ההרשאה EXECUTE בפונקציה RENEWLEASE_QUEUE_NAME:
GoogleSQL
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT EXECUTE ON FUNCTION spanner.renew_lease_QUEUE_NAME TO ROLE_NAME;
כדי לבטל את ההרשאה:
GoogleSQL
REVOKE EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE EXECUTE ON FUNCTION spanner.renewlease_QUEUE_NAME FROM ROLE_NAME;
התקשרות אל RENEWLEASE_QUEUE_NAME() דורשת רק EXECUTE ב-TVF, ולא דורשת SELECT בתור.
מידע נוסף על קבלת הודעות והארכת תקופות השכרה זמין במאמר בנושא שימוש בתורים.
הרשאות להרצת שאילתות ישירות בתורים
כדי לקרוא או לבדוק הודעות ישירות מתור באמצעות SQL סטנדרטי (SELECT * FROM QUEUE_NAME) או Read API, צריך להעניק את ההרשאה SELECT בתור:
GoogleSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;
כדי לבטל את ההרשאה:
GoogleSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
מתן הרשאה SELECT בתור מאפשר להריץ שאילתה על התור כטבלה, אבל לא מאפשר הרשאה EXECUTE על RECEIVE_QUEUE_NAME() או על RENEWLEASE_QUEUE_NAME().
הרשאות לאישור ולמחיקה של הודעות
כדי לאשר או למחוק הודעות מתור באמצעות DML (DELETE FROM) או Mutation API (Ack או Delete), צריך להעניק את ההרשאה DELETE בתור:
GoogleSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;
כדי לבטל את ההרשאה:
GoogleSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;
הרשאות שנדרשות לפעולות בתור
בטבלה הבאה מפורטות ההרשאות הנדרשות לפעולות נפוצות בתור:
| פעולה | הרשאות נדרשות |
|---|---|
שליחת הודעות (DML INSERT או Mutation API Send) |
INSERT ברשימת ההמתנה |
קבלת הודעות (RECEIVE_QUEUE_NAME() TVF) |
EXECUTE בפונקציה RECEIVE_QUEUE_NAME |
הארכת השכרה של הודעה (RENEWLEASE_QUEUE_NAME() TVF) |
EXECUTE בפונקציה RENEWLEASE_QUEUE_NAME |
אישור או מחיקה של הודעות (DML DELETE או Mutation API Ack או Delete) |
DELETE ברשימת ההמתנה |
קריאת נתוני תור ישירות (SQL SELECT או Read API) |
SELECT ברשימת ההמתנה |
דוגמה: הגדרת תפקידים של יוצרים וצרכנים
בדוגמה הבאה מוגדרים תפקידים נפרדים במסד הנתונים עבור יצרן, צרכן ומבקר בתור בשם OrdersQueue:
GoogleSQL
-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO ROLE queue_producer;
-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_OrdersQueue TO ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_OrdersQueue TO ROLE queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO ROLE queue_consumer;
-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO ROLE queue_reader;
PostgreSQL
-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO queue_producer;
-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.receive_OrdersQueue TO queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.renewlease_OrdersQueue TO queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO queue_consumer;
-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO queue_reader;
INFORMATION_SCHEMA צפיות בתורים
בתצוגות הבאות מוצג מידע על תפקידים והרשאות במסד נתונים עבור תורים:
- מסדי נתונים בניב GoogleSQL:
INFORMATION_SCHEMA.TABLE_PRIVILEGES - מסדי נתונים בניב PostgreSQL:
information_schema.table_privileges
מכיוון שמודלים של Spanner מתייחסים לתורים כאובייקטים של סכימה ברמת הטבלה, ההרשאות שניתנות לתורים מופיעות ב-TABLE_PRIVILEGES. הרשאות שניתנו בפונקציות של טבלאות תורים מופיעות ב-ROUTINE_PRIVILEGES.
השורות בתצוגות האלה מסוננות על סמך ההרשאות של התפקיד הנוכחי במסד הנתונים. כך אפשר לוודא שחשבונות משתמשים יכולים לראות רק את התפקידים, ההרשאות והתורים שיש להם גישה אליהם.
סינון שורות חל גם על תצוגות המטא-נתונים הבאות של התור:
GoogleSQL
INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNS
PostgreSQL
information_schema.tablesinformation_schema.columns
סינון השורות חל גם על תצוגות המטא-נתונים של פונקציות של טבלאות בתור (RECEIVE_QUEUE_NAME ו-RENEWLEASE_QUEUE_NAME):
GoogleSQL
PostgreSQL
תפקיד המערכת spanner_info_reader והמשתמשים שמשויכים אליו תמיד רואים INFORMATION_SCHEMA ללא סינון.
הערות והתייחסויות
הרשאות נפרדות להרצת TVF ולשאילתות ישירות בתור: הענקת הרשאת
SELECTבתור לא מעניקה הרשאתEXECUTEבפונקציות המשויכות שמחזירות טבלה (RECEIVE_QUEUE_NAMEאוRENEWLEASE_QUEUE_NAME). באופן דומה, הענקת הרשאתEXECUTEב-TVF לא מעניקה הרשאתSELECTבתור.- אם תפקיד עם הרשאה
SELECTבלבד בתור מנסה להפעיל אתRECEIVE_QUEUE_NAME(), Spanner מחזירה שגיאה שמציינת שלתפקיד אין את ההרשאות הנדרשות בפונקציית הטבלהRECEIVE_QUEUE_NAME. - אם תפקיד עם הרשאה
EXECUTEבלבד ב-TVF ינסה להפעיל אתSELECT * FROM QUEUE_NAME, Spanner יחזיר שגיאה שבה מצוין שלתפקיד אין את ההרשאות הנדרשות בתורQUEUE_NAME.
- אם תפקיד עם הרשאה
ההבדל מזרמי שינויים: בניגוד לזרמי שינויים (שנדרשים בהם גם
SELECTבזרם וגםEXECUTEבפונקציית הקריאה), צרכני הודעות בתור דורשים רקEXECUTEב-TVFRECEIVE. הם לא דורשיםSELECTבתור עצמו.אין תמיכה בהרשאות ברמת העמודה: בניגוד לטבלאות, ב-Spanner אין תמיכה בהרשאות ברמת העמודה בתורים (כמו
GRANT SELECT (COLUMN_NAME) ON QUEUE). צריך להעניק הרשאות לאובייקט התור כולו, כי התורים כוללים עמודות פנימיות של מטא-נתונים של המערכת.הפרדה בין תפקידי היצרן והצרכן: מומלץ להגדיר תפקידים נפרדים במסד הנתונים עבור יצרני הודעות וצרכני הודעות. לדוגמה:
- תפקיד של מפיק עם
INSERTבלבד בתור. - תפקיד של צרכן עם
EXECUTEבפונקציותRECEIVE_QUEUE_NAMEו-RENEWLEASE_QUEUE_NAME, בנוסף ל-DELETEבתור אם מאשרים הודעות באמצעותDELETEאו המוטציהAck.
- תפקיד של מפיק עם
DML ישיר לעומת מסירת TVF בתור: הצהרות ישירות של
DELETEאוUPDATEעוקפות את השכרת התור ואת מכונת המצבים של המסירה. מומלץ להגביל את ההרשאות האלה לתפקידי אדמין או לתפקידים שקשורים לתחזוקה.