תצוגות מורשות

במאמר הזה מוסבר איך ליצור תצוגות מורשות ותצוגות מהותיות מורשות ב-BigQuery. כאדמינים של נתונים, אתם יכולים ליצור תצוגה מורשית כדי לשתף קבוצת משנה של נתונים במערך נתונים עם משתמשים וקבוצות ספציפיים (חשבונות משתמשים). החשבונות הראשיים יכולים לראות את הנתונים שאתם משתפים ולהריץ עליהם שאילתות, אבל הם לא יכולים לגשת ישירות למערך הנתונים המקורי.

סוגי תצוגות

תצוגה לוגית היא סוג התצוגה שמוגדר כברירת מחדל ב-BigQuery, ותצוגה מהותית היא תצוגה שחושבה מראש ושומרת במטמון מדי פעם את תוצאות השאילתה כדי לשפר את הביצועים והיעילות.

תצוגה מורשית של תצוגה לוגית נקראת תצוגה מורשית, אבל תצוגה מורשית של תצוגה מהותית נקראת תצוגה מהותית מורשית.

אם תצוגה לוגית מסתמכת על שאילתה גדולה או יקרה מבחינה חישובית, אתם יכולים ליצור במקומה תצוגה מהותית. במאמר סקירה כללית של תצוגות לוגיות ותצוגות מהותיות מוסבר על תרחישי השימוש של תצוגה לוגית ותצוגה מהותית.

השלבים העיקריים ליצירת תצוגות מורשות

כדי ליצור ולשתף תצוגה, עיינו בשלבים הכלליים הבאים, שהם זהים לתצוגות לוגיות מורשות ולתצוגות מהותיות מורשות.

  • יוצרים קבוצת נתונים שתכיל את נתוני המקור.
  • מריצים שאילתה כדי לטעון נתונים לטבלת יעד במערך הנתונים של המקור.
  • יוצרים קבוצת נתונים שתכיל את התצוגה המורשית.
  • יוצרים תצוגה מורשית משאילתת SQL שמגבילה את העמודות שמנתחי הנתונים יכולים לראות בתוצאות השאילתה.
  • נותנים למנתחי הנתונים הרשאה להריץ משימות של שאילתות.
  • נותנים למנתחי הנתונים גישה למערך הנתונים שמכיל את התצוגה המורשית.
  • נותנים לתצוגה המורשית גישה למערך הנתונים של המקור.

חלופות

למרות שהתצוגות המורשות הן גמישות וניתנות להתאמה, יכול להיות שאחת מהשיטות הבאות תתאים יותר לתרחיש לדוגמה שלכם:

  • הגדרת כללי מדיניות ברמת השורה בטבלה.
  • הגדרת כללי מדיניות ברמת העמודה בטבלה.
  • אחסון נתונים בטבלה נפרדת.
  • לשתף את כל התצוגות במערך נתונים (מערכי נתונים מורשים).

שימוש באבטחה ברמת השורה או העמודה, או בטבלאות נפרדות

כדי להגביל את היכולת של המשתמשים לראות את הנתונים, מנהלי הנתונים יכולים להגדיר מדיניות גישה ברמת השורה בטבלה, או ליצור טבלה נפרדת לנתונים הרגישים. אחסון הנתונים בטבלה נפרדת מבודד את הנתונים ומסיר את היכולת לראות כמה שורות יש בטבלה.

בנוסף, אדמין של נתונים יכול ליצור ולהחיל תגי מדיניות כדי להגביל את היכולת של המשתמשים לראות עמודות בטבלה.

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

כדי להשוות בין השיטות האלה, אפשר לעיין במקורות המידע הבאים:

שיתוף כל התצוגות בקבוצת נתונים

אם אתם רוצים לתת לקבוצה של תצוגות גישה למערך נתונים בלי שתצטרכו לאשר כל תצוגה בנפרד, אתם יכולים לקבץ את התצוגות למערך נתונים, ואז לתת למערך הנתונים שמכיל את התצוגות גישה למערך הנתונים שמכיל את הנתונים.

לאחר מכן תוכלו לתת לחשבונות המשתמשים גישה למערך הנתונים שמכיל את קבוצת התצוגות, או לתצוגות ספציפיות במערך הנתונים, לפי הצורך. מערך נתונים שיש לו גישה למערך נתונים אחר נקרא מערך נתונים מורשה. מערך הנתונים שנותן הרשאת גישה למערך נתונים אחר נקרא מערך הנתונים המשותף.

רשימת בקרת הגישה של מערך נתונים יכולה לכלול עד 2,500 משאבים מורשים, כולל תצוגות מורשות, מערכי נתונים מורשים ופונקציות מורשות. אם חורגים מהמגבלה הזו בגלל מספר גדול של תצוגות מורשות, כדאי לקבץ את התצוגות לקבוצות נתונים מורשות. כשאתם מתכננים ארכיטקטורות חדשות של BigQuery, במיוחד ארכיטקטורות עם כמה דיירים, כדאי לקבץ תצוגות קשורות למערכי נתונים מורשים.

מידע נוסף זמין במאמרים מערכי נתונים מורשים ומתן הרשאה למערך נתונים.

מגבלות

  • כשיוצרים תצוגה מורשית או תצוגה מהותית מורשית במערך נתונים אחר, מערך הנתונים של נתוני המקור ומערך הנתונים של התצוגה המורשית צריכים להיות באותו מיקום אזורי.
  • כשמוחקים תצוגה מורשית, יכול להיות שיעברו עד 24 שעות עד שהיא תוסר מרשימת התצוגות. במהלך פרק הזמן הזה, אי אפשר לגשת לתצוגה המורשית, אבל התצוגה המורשית שנמחקה יכולה להופיע ברשימת התצוגות, והיא נספרת במסגרת מגבלת התצוגות המורשות. המגבלה הזו יכולה למנוע יצירה של תצוגות מורשות נוספות, אם התצוגה המורשית החדשה תחרוג מהמגבלה.
  • אי אפשר ליצור תצוגה מורשית ברפליקה משנית. מידע נוסף זמין במאמר התנהגות המשאבים ברפליקציה של מערכי נתונים.

לפני שמתחילים

להקצות תפקידים של ניהול זהויות והרשאות גישה (IAM) שנותנים למשתמשים את ההרשאות הנדרשות כדי לשלוח שאילתות לתצוגות המורשות או לתצוגות המהותיות המורשות שאתם משתפים.

תצוגות מורשות ו-VPC Service Controls

כשמשתמשים בתצוגות מורשות בהיקף של VPC Service Controls, כללי תעבורת הנתונים הנכנסת והיוצאת צריכים לאפשר לחשבונות המשתמשים גישה לפרויקט שמכיל את התצוגה, ולכל פרויקט אחר שמכיל את נתוני המקור שהתצוגה ניגשת אליהם.

לדוגמה, בתרשים הבא, מבצע הקריאה החוזרת בפרויקט R ניגש לתצוגה המורשית בפרויקט A, שטבלת המקור שלה נמצאת בפרויקט B. במקרה כזה, הכללים לתעבורת נתונים נכנסת ויוצאת של VPC Service Controls צריכים לאפשר למי שמבצע את הקריאה בפרויקט R לגשת גם לפרויקט א' וגם לפרויקט ב' באמצעות שירות BigQuery.

alt

ההרשאות הנדרשות לגישה ל-VPC Service Controls

לחשבון המשתמש לא נדרשות הרשאות של ניהול זהויות והרשאות גישה בפרויקט של נתוני המקור, אבל כלל התעבורה הנכנסת חייב לאפשר גישה לשירות BigQuery בפרויקט המקור שמכיל את טבלת המקור, בנוסף לאפשרות גישה לפרויקט שמכיל את התצוגה.

למידע על התפקידים וההרשאות הנדרשים, ראו הרשאות משתמשים בפרויקט ובמערך הנתונים.

כללים לתעבורת נתונים נכנסת (ingress) ויוצאת (egress)

בדוגמאות הבאות של כללי תעבורת נתונים נכנסת ויוצאת ב-VPC Service Controls, ממשק ה-API של BigQuery יכול לגשת גם לפרויקט המקור וגם לפרויקט התצוגה.

לדוגמה, אם יוצרים תצוגה ב-PROJECT_A (תצוגה) שניגשת לנתונים ב-PROJECT_B (מקור), צריך את קבוצת כללי תעבורת הנתונים הנכנסת הבאה בשביל PROJECT_B וקבוצה נוספת של כללי תעבורת נתונים נכנסת בשביל PROJECT_A:

- ingressFrom:
    identityType: caller_r
    sources:
    - resource:
      - projects/project_r
  ingressTo:
    operations:
    - serviceName: bigquery.googleapis.com
      methodSelectors:
      - method: *
    resources:
    - projects/project_b
  title: Ingress rules for the source project

בקובץ ה-YAML הבא מוצגת קבוצת כללי התעבורה היוצאת של PROJECT_B (המקור). תצטרכו גם קבוצה של כללים לתעבורת נתונים יוצאת (egress) בשביל PROJECT_A (תצוגה):

- egressTo:
    operations:
    - serviceName: bigquery.googleapis.com
      methodSelectors:
      - method: *
    resources:
    - projects/project_b
  egressFrom:
    identityType: caller_r
    sources:
    - resource:
      - projects/project_r
  title: Egress rules for the source project

התפקידים הנדרשים

כדי ליצור או לעדכן תצוגה מורשית, אתם צריכים הרשאות למערך הנתונים שמכיל את התצוגה ולמערך הנתונים שנותן גישה לתצוגה.

בנוסף, צריך לתת למשתמשים או לקבוצות גישה לפרויקט ולקבוצת הנתונים שמכילים את התצוגה.

הרשאות במערך הנתונים שמכיל את התצוגה

תצוגות נחשבות למשאבי טבלה ב-BigQuery, ולכן כדי ליצור תצוגה נדרשות אותן הרשאות כמו ליצירת טבלה. בנוסף, צריכות להיות לכם הרשאות לשלוח שאילתות לכל הטבלאות שמוזכרות בשאילתת ה-SQL של התצוגה.

  • כדי ליצור קבוצת נתונים, צריך הרשאת IAM מסוג bigquery.datasets.create בפרויקט.
  • כדי ליצור תצוגה, צריך הרשאת IAM מסוג bigquery.tables.create במערך הנתונים. התפקיד המוגדר מראש roles/bigquery.dataEditor ב-IAM כולל את ההרשאות שנדרשות כדי ליצור תצוגה.
  • כדי ליצור תצוגה ששולחת שאילתה לטבלה שאין לכם גישה אליה, אתם צריכים לקבל את ההרשאה bigquery.tables.getData בטבלה שהתצוגה שולחת אליה שאילתה.

למידע נוסף על תפקידים והרשאות של IAM ב-BigQuery, קראו את המאמר תפקידים והרשאות מוגדרים מראש.

הרשאות במערך הנתונים שמכיל את נתוני המקור

כדי לאשר תצוגה, מעניקים לה הרשאות קריאה למערך הנתונים של נתוני המקור.

כדי לבצע את ההרשאה הזו, צריך את ההרשאות הבאות במערך הנתונים שמכיל את נתוני המקור:

  • bigquery.datasets.update
  • datasets.getIamPolicy
  • datasets.setIamPolicy

כדי לראות אילו הרשאות נוספות נדרשות כדי לעדכן מערכי נתונים, קראו את המאמר ההרשאות הנדרשות.

הרשאות משתמש בפרויקט ובמערך הנתונים של התצוגה

כדי לשתף תצוגה מורשית עם משתמשים או קבוצות, צריך לתת למשתמשים או לקבוצות את הרשאות ה-IAM הבאות:

  • תפקיד ה-IAM‏ roles/bigquery.jobUser (או roles/bigquery.user) בפרויקט שבו מופעלת משימת השאילתה (הפרויקט לחיוב או הפרויקט להפעלה). התפקיד הזה מעניק את ההרשאה bigquery.jobs.create, שנדרשת כדי להריץ משימות של שאילתות בתצוגה.

    תפקיד ה-IAM‏ roles/bigquery.jobUser נדרש רק לפרויקט שבו רוצים להריץ את המשימה, בלי קשר למקום שבו התצוגה מתארחת.

  • תפקיד IAM מסוג roles/bigquery.dataViewer במערך הנתונים שמכיל את התצוגה המורשית. התפקיד הזה נותן את ההרשאה bigquery.tables.getData, שנדרשת כדי לשלוח שאילתות לתצוגה.

    אם משתמש שולח שאילתה לתצוגה המורשית מפרויקט נפרד, הוא לא צריך את התפקיד roles/bigquery.jobUser בפרויקט שמארח את התצוגה. הם צריכים את התפקיד roles/bigquery.dataViewer במערך הנתונים שמכיל את התצוגה, ואת התפקיד roles/bigquery.jobUser בפרויקט שבו השאילתה פועלת.

עבודה עם תצוגות מורשות

בקטעים הבאים מוסבר איך לעבוד עם תצוגות מורשות ועם תצוגות מהותיות מורשות.

יצירת תצוגה מורשית

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בעורך השאילתות, מקלידים את השאילתה שעליה רוצים לבסס את התצוגה המורשית.

  3. לוחצים על קובץ > שמירה > שמירת התצוגה.

  4. בתיבת הדו-שיח Save view:

    1. בשדה Project, מקלידים את הפרויקט שבו רוצים לשמור את התצוגה.

    2. בשדה Dataset, מקלידים את מערך הנתונים שבו רוצים לשמור את התצוגה. קבוצת הנתונים הזו חייבת להיות שונה מקבוצת הנתונים שמשמשת בשאילתת המקור.

    3. ב-Table, מקלידים את שם התצוגה.

    4. לוחצים על Save.

  5. נותנים את ההרשאות הנדרשות למשתמשים שיכולים להשתמש בתצוגה המורשית.

  6. בחלונית Explorer, בוחרים את מערך הנתונים שמשמש בשאילתת המקור.

  7. בחלונית Details, לוחצים על Sharing > Authorize views.

  8. בחלונית Authorized views, בשדה Authorized view, מקלידים את השם המלא של התצוגה בפורמט PROJECT_ID.DATASET_ID.VIEW_NAME.

  9. לוחצים על הוספת הרשאה.

Terraform

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

# Creates an authorized view.

# Create a dataset to contain the view.
resource "google_bigquery_dataset" "view_dataset" {
  dataset_id  = "view_dataset"
  description = "Dataset that contains the view"
  location    = "us-west1"
}

# Create the view to authorize.
resource "google_bigquery_table" "movie_view" {
  project     = google_bigquery_dataset.view_dataset.project
  dataset_id  = google_bigquery_dataset.view_dataset.dataset_id
  table_id    = "movie_view"
  description = "View to authorize"

  view {
    query          = "SELECT item_id, avg(rating) FROM `movie_project.movie_dataset.movie_ratings` GROUP BY item_id ORDER BY item_id;"
    use_legacy_sql = false
  }
}


# Authorize the view to access the dataset
# that the query data originates from.
resource "google_bigquery_dataset_access" "view_authorization" {
  project    = "movie_project"
  dataset_id = "movie_dataset"

  view {
    project_id = google_bigquery_table.movie_view.project
    dataset_id = google_bigquery_table.movie_view.dataset_id
    table_id   = google_bigquery_table.movie_view.table_id
  }
}

# Specify the IAM policy for principals that can access
# the authorized view. These users should already
# have the roles/bigqueryUser role at the project level.
data "google_iam_policy" "principals_policy" {
  binding {
    role = "roles/bigquery.dataViewer"
    members = [
      "group:example-group@example.com",
    ]
  }
}

# Set the IAM policy on the authorized  view.
resource "google_bigquery_table_iam_policy" "authorized_view_policy" {
  project     = google_bigquery_table.movie_view.project
  dataset_id  = google_bigquery_table.movie_view.dataset_id
  table_id    = google_bigquery_table.movie_view.table_id
  policy_data = data.google_iam_policy.principals_policy.policy_data
}

כך מחילים את ההגדרות של Terraform בפרויקט ב- Cloud de Confiance :

הכנת Cloud Shell

  1. מפעילים את Cloud Shell.
  2. מגדירים את פרויקט ברירת המחדל ב- Cloud de Confiance שבו רוצים להחיל את ההגדרות של Terraform.

    תצטרכו להריץ את הפקודה הזו רק פעם אחת לכל פרויקט, ותוכלו לעשות זאת בכל ספרייה.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    אם תגדירו ערכים ספציפיים בקובץ התצורה של Terraform, הם יבטלו את ערכי ברירת המחדל של משתני הסביבה.

הכנת הספרייה

לכל קובץ תצורה של Terraform צריכה להיות ספרייה משלו (שנקראת גם מודול ברמה הבסיסית).

  1. יוצרים ספרייה חדשה ב-Cloud Shell ובה יוצרים קובץ חדש. שם הקובץ חייב לכלול את הסיומת .tf, למשל main.tf. במדריך הזה, הקובץ נקרא main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. אם אתם עוקבים אחרי המדריך, תוכלו להעתיק את הקוד לדוגמה בכל קטע או שלב.

    מעתיקים את הקוד לדוגמה בקובץ main.tf החדש שיצרתם.

    לחלופין, אפשר גם להעתיק את הקוד מ-GitHub. כדאי לעשות את זה כשקטע הקוד של Terraform הוא חלק מפתרון מקצה לקצה.

  3. בודקים את הפרמטרים לדוגמה ומשנים אותם בהתאם לסביבה שלכם.
  4. שומרים את השינויים.
  5. מפעילים את Terraform. צריך לעשות זאת רק פעם אחת לכל ספרייה.
    terraform init

    אופציונלי: תוכלו לכלול את האפשרות -upgrade, כדי להשתמש בגרסה העדכנית ביותר של הספק של Google:

    terraform init -upgrade

החלה של השינויים

  1. בודקים את ההגדרות ומוודאים שהמשאבים שמערכת Terraform תיצור או תעדכן תואמים לציפיות שלכם:
    terraform plan

    מתקנים את ההגדרות לפי הצורך.

  2. מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה, כדי להחיל את הגדרות Terraform:
    terraform apply

    ממתינים עד שב-Terraform תוצג ההודעה "Apply complete!‎".

  3. פותחים את הפרויקט ב- Cloud de Confiance כדי להציג את התוצאות. במסוף Cloud de Confiance , נכנסים למשאבים בממשק המשתמש כדי לוודא שהם נוצרו או עודכנו ב-Terraform.

ניהול משתמשים או קבוצות בתצוגות מורשות

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

  • לצפות במדיניות הגישה.
  • נותנים גישה.
  • ביטול הגישה.
  • למנוע גישה.

מידע נוסף זמין במאמר שליטה בגישה למשאבים באמצעות IAM.

הסרת הרשאה לתצוגה

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

המסוף

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בחלונית השמאלית, לוחצים על Explorer:

    כפתור מודגש לחלונית Explorer.

    אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.

  3. בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ובוחרים קבוצת נתונים.

  4. לוחצים על סקירה כללית > טבלאות ובוחרים טבלה.

  5. לוחצים על Sharing > Authorize views.

  6. לוחצים על כדי להסיר את ההרשאה.

  7. לוחצים על Close.

BQ

כדי להסיר את ההרשאה מתצוגה, משתמשים בפקודה bq rm. מזינים את table_id של התצוגה שרוצים להסיר ממנה את ההרשאה.

    bq rm \
    project_id:dataset:table_id
    

API

מפעילים את ה-method‏ tables.delete ומשתמשים במאפיינים projectID,‏ datasetID ו-tableID כדי להסיר את התצוגה המורשית של מערך הנתונים. מידע נוסף זמין במאמר טבלאות.

הרשאה שבוטלה ו-VPC Service Controls

כשמבצעים שאילתה בתצוגה מורשית כדי לגשת לנתונים במערך נתונים של מקור, דרך היקף של VPC Service Controls, השאילתה עוקפת את הבדיקות הרגילות של VPC Service Controls בטבלאות הבסיס.

אם תבטלו או תסירו את ההרשאה לתצוגה מקבוצת הנתונים של המקור, BigQuery יחזור לבדיקות הרשאה רגילות וישלח שאילתות ישירות למסדי הנתונים הטבלאיים בפרויקט המקור. אם מסדי הנתונים הטבלאיים האלה חוצים את גבולות הגזרה של VPC Service Controls בלי כללי תעבורת נתונים יוצאת מפורשים שמאפשרים גישה ישירה לטבלה, VPC Service Controls חוסם את השאילתה ומחזיר שגיאות של הפרת תעבורת נתונים נכנסת או יוצאת.

כשמשחזרים את ההרשאה לתצוגה במערך הנתונים של המקור, BigQuery עוקף שוב את הבדיקות הישירות של מסד הנתונים הטבלאי, והשגיאות של VPC Service Controls נפתרות.

מכסות ומגבלות

  • תצוגות מורשות כפופות למגבלות של מערכי נתונים. מידע נוסף זמין במאמר מגבלות של מערכי נתונים.
  • אם מסירים תצוגה מורשית, יכול להיות שיעברו עד 24 שעות עד שכל ההפניות לתצוגה יוסרו מהמערכת. כדי למנוע שגיאות, צריך להמתין 24 שעות לפני שמשתמשים שוב בשם של תצוגה שהוסרה, או ליצור שם ייחודי לתצוגה.

נושאים מתקדמים

בקטעים הבאים מתוארות שיטות מתקדמות לשימוש בתצוגות מורשות.

שילוב של אבטחה ברמת השורה עם תצוגות מורשות

הנתונים שמוצגים בתצוגה לוגית או בתצוגה מהותית מסוננים בהתאם למדיניות הגישה ברמת השורה של טבלת המקור הבסיסית.

למידע נוסף על האינטראקציה בין אבטחה ברמת השורה לבין תצוגות מהותיות, קראו את המאמר שימוש באבטחה ברמת השורה עם תכונות אחרות של BigQuery.

שילוב של אבטחה ברמת העמודה עם תצוגות מורשות

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

במאמר תצוגות של שאילתות מוסבר בפירוט איך מחילים הרשאות לאבטחה ברמת העמודה.

שימוש ב-BigQuery sharing עם תצוגות מורשות

‫BigQuery sharing (לשעבר Analytics Hub) היא פלטפורמה להחלפת נתונים עם היכולות הבאות:

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

מערך נתונים מקושר הוא מערך נתונים לקריאה בלבד ב-BigQuery, שמשמש כמצביע או כהפניה למערך נתונים משותף. כשנרשמים לרשימה של שיתוף, נוצרת קבוצת נתונים מקושרת בפרויקט שלכם, אבל לא עותק של קבוצת הנתונים. לכן, המנויים יכולים לקרוא את הנתונים אבל לא להוסיף או לעדכן אובייקטים בתוכם.

אין תמיכה בתצוגות מהותיות שמפנות לטבלאות במערך הנתונים המקושר.

מידע נוסף זמין במאמר מבוא לשיתוף.

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