יצירת סשנים לקריאה בלבד ב-Cloud SQL ל-PostgreSQL

אפשר ליצור סשן לקריאה בלבד ב-Cloud SQL ל-PostgreSQL באמצעות הפרמטר cloudsql_session_read_only session. הגישה הזו היא דרך חזקה יותר למנוע שינוי נתונים במהלך סשן, בהשוואה לאפשרויות הרגילות של PostgreSQL לקריאה בלבד. באמצעות הפרמטר cloudsql_session_read_only, אפשר להגדיר את הסשן כקריאה בלבד באופן זמני או קבוע למשך הסשן. אתם יכולים להשתמש בסוג כזה של סשנים לקריאה בלבד כדי להגן על תקינות נתונים בהקשרים שונים, כולל בסשנים שבהם אתם משתמשים בכלים של Model Context Protocol‏ (MCP), בכלים לדיווח ובכלים לביקורת.

כברירת מחדל, cloudsql_session_read_only מוגדר כ-off, שמאפשר שינוי נתונים.

מה אי אפשר לעשות במצב קריאה-בלבד

בסשן לקריאה בלבד, אי אפשר לשנות נתונים במסד הנתונים. באופן ספציפי, במצב קריאה-בלבד אי אפשר לבצע את הפעולות הבאות:

  • במצב קריאה בלבד לא נוצרים מזהי עסקאות חדשים. אי אפשר להתחיל עסקאות שניתן לכתוב בהן, ולכן אי אפשר להפעיל הוראות של שפת טיפול בנתונים (DML) או שפת הגדרת נתונים (DDL). עם זאת, אם הדגל מוגדר באמצע של טרנזקציה פעילה שניתן לכתוב בה, אפשר להריץ הוראות בסיסיות של DML ו-DDL עד שהטרנזקציה מסתיימת.

  • במצב קריאה בלבד אי אפשר להשתמש בסוגים הבאים של הצהרות וקריאות:

    • הצהרות כמו VACUUM ו-NOTIFY.
    • פונקציות עם תופעות לוואי. המשמעות היא שאי אפשר לקרוא ל-FUNCTION או להפעיל PROCEDURE שמוגדרים גם כ-VOLATILE וגם כ-LANGUAGE C או כ-LANGUAGE internal, כי חלק מתופעות הלוואי שלהם לא דורשות מזהה עסקה. לדוגמה, pg_promote(), pg_cancel_backend() ו-pg_terminate_backend().
    • עטיפות נתונים חיצוניות.
    • כל פונקציה או פרוצדורה שיצרתם בשפת פרוצדורות של SQL‏ (PL).

הגדרת סטטוס קריאה בלבד

במהלך סשן של Cloud SQL ל-PostgreSQL, אפשר להשתמש בהצהרת SET כדי לשנות את הערך של הדגל cloudsql_session_read_only באופן הבא:

  • SET cloudsql_session_read_only = 'on'

    ההצהרה הזו מגדירה את הסשן לקריאה בלבד, ומונעת מכל אחד לשנות את הנתונים כל עוד הדגל מוגדר לערך on. כדי להמשיך לשנות את הנתונים בהמשך הסשן, צריך לשנות את הערך בחזרה ל-off:

  • SET cloudsql_session_read_only = 'off'

    הגדרת הדגל בחזרה לערך off משחזרת את גישת הכתיבה בסשן, אלא אם הדגל מוגדר לערך locked.

  • SET cloudsql_session_read_only = 'locked'

    הגדרת הדגל ל-locked הופכת את הסשן לקריאה בלבד באופן קבוע. אחרי שהדגל מוגדר לערך locked, אי אפשר לשנות את הדגל לערך אחר כלשהו למשך הפעלת המשתמש.

כדי להגדיר סשן לקריאה בלבד באופן קבוע ברגע שמתחברים למסד הנתונים, צריך להטמיע את הדגל cloudsql_session_read_only במחרוזת החיבור של הסשן:

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?options=-ccloudsql_session_read_only=locked

מחליפים את הפרטים הבאים:

  • USER: שם המשתמש של המשתמש שיצר את הסשן.
  • PASSWORD: הסיסמה של המשתמש.
  • HOST: כתובת ה-URL של המארח.
  • PORT: מספר היציאה.
  • DATABASE: שם מסד הנתונים.

היתרון הנוסף בגישה הזו הוא שאם מנסים להתחבר לגרסה ישנה יותר של Cloud SQL שלא תומכת בסשנים לקריאה בלבד, החיבור ייכשל.

אפשר גם לשלול ממשתמש מסוים במסד הנתונים את הרשאת הכתיבה לכל החיבורים העתידיים, כך:

ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';

מחליפים את USERNAME בשם המשתמש של המשתמש שרוצים להגביל את הגישה שלו לקריאה בלבד.

הפעלת פונקציות ספציפיות בסשנים לקריאה בלבד

  • אתם יכולים לאפשר שימוש ב-FUNCTION או ב-PROCEDURE מסוימים שהוגדרו כ-VOLATILE וגם כ-LANGUAGE C או כ-LANGUAGE internal. כדי לעשות זאת, מצרפים SECURITY LABEL לפונקציה או לפרוצדורה שמוגדרות ל-allow.
  • כדי לאסור שימוש בפונקציה מסוימת בסשן, מגדירים הצהרה SECURITY LABEL לערך deny.
  • כדי להוסיף לרשימת ההיתרים פונקציות שלא משפיעות על המצב הגלובלי, צריך ליצור קבוצה מוגדרת מראש של תוויות אבטחה:

    CREATE EXTENSION "google_read_only_session"
    

    התוסף google_read_only_session מאפשר:

    • כל הפונקציות המובנות של C שמשתנות ושאפשר להשתמש בהן במצב קריאה בלבד.
    • כל הפונקציות שמותרות במצב קריאה בלבד שמגיעות מתוספים שנטענו במסד הנתונים, כולל פונקציות הטיפול בשפות pl/pgsql ו-pl/v8.

    אם מתקינים תוסף חדש אחד או יותר אחרי כן, כדי להחיל תוויות של קבוצות, צריך להסיר את התוסף google_read_only_session וליצור אותו מחדש:

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    הפקודה DROP לא מסירה תוויות קיימות. הפקודה השנייה CREATE מוסיפה תוויות לפונקציות C שמשתנות בתוסף החדש.

המאמרים הבאים