1. مقدمه
در این کد لبه، نحوه محافظت از BigQuery API با استفاده از کنترلهای سرویس VPC را خواهید آموخت. کد لبه با هیچ سرویس API محافظت شده توسط محیط سرویس شروع می شود و اجازه می دهد پرس و جوها بر روی مجموعه داده های عمومی اجرا شوند و نتایج در جدول پروژه ذخیره شوند. پرس و جو در یک پروژه اجرا می شود و جدول (جایی که نتایج ذخیره می شوند) در پروژه دیگری ایجاد می شود، با تقلید از تنظیماتی که در آن داده ها می توانند در یک پروژه ذخیره شوند اما باید با استفاده از پروژه دیگری به آنها دسترسی داشت.
در مرحله بعد، یک محیط سرویس برای محافظت از پروژه داده معرفی می کنیم. شما یاد خواهید گرفت که چگونه با استفاده از قوانین ورودی و قوانین خروج، نقض های مشاهده شده را برطرف کنید و بعداً یک سطح دسترسی برای محدود کردن دسترسی با استفاده از آدرس های IP داخلی اضافه کنید. اهداف این کد لبه عبارتند از:
- نحوه رفع تخلفات ورود و خروج را با استفاده از قوانین ورود و خروج به ترتیب درک کنید.
- درک کنید که چرا یک تخلف خاص رخ داده است.
- دامنه رفع تخلف اعمال شده را تجزیه و تحلیل کنید.
- اصلاح (قاعده ورود/خروج) را تغییر دهید تا دامنه آن را با اعمال اهرمی برای اجازه دادن به ترافیک از آدرسهای IP داخلی در شبکه VPC با استفاده از سطوح دسترسی تغییر دهید.
2. راه اندازی منابع و الزامات
قبل از شروع
در این کد لبه فرض می کنیم که شما قبلاً می دانید:
- اصول اولیه اجرای یک پرس و جو BigQuery : می توانید این نرم افزار کد را بررسی کنید تا نحوه پرس و جو از مجموعه داده های ویکی پدیا در BigQuery را بیاموزید.
- نحوه ایجاد و مدیریت یک پوشه
- نحوه ایجاد یک پروژه در یک پوشه یا انتقال پروژه موجود در یک پوشه
- نحوه ایجاد یک خط مشی دسترسی محدوده
- نحوه ایجاد و پیکربندی یک محیط سرویس
- چگونه نقض سیاست های امنیتی را در لاگ ها پیدا کنیم
راه اندازی
راه اندازی اولیه ما به شرح زیر طراحی شده است:
- یک سازمان Google Cloud.
- پوشه ای در زیر سازمان. برای این Codelab ما آن را
codelab-folder
می نامیم. - دو پروژه Google Cloud در یک پوشه،
codelab-folder
قرار گرفتهاند. برای این کد لبه، ما آنها راproject-1
وproject-2
می نامیم- اگر پوشه و پروژههایی را که قبلاً ایجاد کردهاید ندارید، در کنسول Google Cloud ، یک پوشه در زیر سازمان ایجاد کنید و دو پروژه جدید در آن پوشه ایجاد شده ایجاد کنید .
- مجوزهای مورد نیاز:
- نقش های IAM برای مدیریت پوشه ها : در سطح پوشه اختصاص داده می شود
- نقش های IAM برای مدیریت پروژه ها : در سطح پروژه اختصاص داده شده است
- نقش های IAM مورد نیاز برای پیکربندی کنترل های سرویس VPC : در سطح سازمان اختصاص داده می شود
- نقش های IAM برای مدیریت BigQuery : در سطح پروژه اختصاص داده شده است
- نقش های IAM برای مدیریت نمونه موتور محاسباتی : در سطح پروژه اختصاص داده شده است
- حساب صورتحساب برای هر دو پروژه،
project-2
وproject-1
.
یک محیط سرویس منظم ایجاد کنید
در این کد لبه، از یک سرویس معمولی محافظت از محیط project-1
استفاده خواهیم کرد.
- یک محیط معمولی ،
perimeter-1
ایجاد کنید وproject-1
اضافه کنید.
ایجاد ماشین مجازی کامپیوتری
در این کد لبه، از 1 نمونه Compute Engine در project-2
استفاده خواهیم کرد که در us-central1
قرار دارد و از شبکه پیشفرض VPC با نام default
استفاده میکنیم.
- میتوانید به مستندات بهعنوان دستورالعملی برای ایجاد یک نمونه موتور محاسباتی از یک تصویر عمومی مراجعه کنید.
هزینه
برای استفاده از منابع/APIهای ابری باید صورتحساب را در کنسول Google Cloud فعال کنید. توصیه می کنیم برای جلوگیری از تحمیل صورتحساب فراتر از این کد، منابع استفاده شده را خاموش کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
منابعی که هزینه دارند عبارتند از BigQuery و Compute Engine. میتوانید با استفاده از ماشینحساب قیمتگذاری BigQuery و محاسبهگر قیمتگذاری Compute Engine، هزینه را تخمین بزنید.
3. دسترسی به BigQuery بدون محدودیت های کنترل سرویس VPC
مجموعه داده های عمومی را پرس و جو کنید و نتایج را در project-1
ذخیره کنید
- با مراجعه به صفحه BigQuery Studio، به
project-2
وproject-1
دسترسی پیدا کنید تا بررسی کنید که آیا می توانید به BigQuery API دسترسی پیدا کنید. شما باید بتوانید این کار را انجام دهید زیرا حتی اگرproject-1
در یک محیط سرویس باشد، محیط هنوز از هیچ سرویسی محافظت نمی کند. - از
project-2
، پرس و جوی زیر را برای پرس و جو از یک مجموعه داده عمومی اجرا کنید.
SELECT name, SUM(number) AS total
FROM `bigquery-public-data.usa_names.usa_1910_2013`
GROUP BY name
ORDER BY total DESC
LIMIT 10;
پس از اجرای پرس و جو در مجموعه داده عمومی (در حالی که در project-2
باقی مانده است):
- روی Save Results کلیک کنید و جدول BigQuery را انتخاب کنید. (به اسکرین شات زیر مراجعه کنید).
-
project-1
به عنوان پروژه مقصد انتخاب کنید. - مجموعه داده را
codelab_dataset
نامگذاری کنید. ( CREATE NEW DATASET را انتخاب کنید، مگر اینکه از یک مجموعه داده موجود استفاده کنید). - نام جدول را به این صورت بگذارید:
codelab-table
. - روی ذخیره کلیک کنید.
داده های مجموعه عمومی با موفقیت در project-1
در نتیجه اجرای پرس و جو از project-2
ذخیره شده است.
Query Dataset در project-1
از project-2
ذخیره شده است
در حین باقی ماندن در project-2
BigQuery Studio، کوئری زیر را برای انتخاب داده ها اجرا کنید:
- پروژه:
project-1
- مجموعه داده:
codelab_dataset
- جدول:
codelab-table
SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;
پرس و جو باید با موفقیت اجرا شود، زیرا نه project-2
و نه project-1
محدود به استفاده از BigQuery نیستند. دسترسی به BigQuery از و به هر جایی مجاز است تا زمانی که کاربر دارای مجوزهای IAM مناسب باشد.
این نمودار فرآیندی را نشان می دهد که یک مدیر یک مجموعه داده BigQuery را پرس و جو می کند. هر کوئری BigQuery یک کار BigQuery را آغاز می کند، که سپس عملیات واقعی را در این سناریو انجام می دهد و داده ها را بازیابی می کند. دسترسی اصلی از یک نمونه Compute Engine و از اینترنت نشان داده می شود، در حالی که پرس و جو از یک مجموعه داده عمومی و از یک پروژه Google Cloud جداگانه انجام می شود. فرآیند جستجوی داده ها (
GetData
) بدون مسدود شدن توسط کنترل های سرویس VPC موفقیت آمیز است.
4. از BigQuery API در پروژه مجموعه داده منبع محافظت کنید
پیکربندی perimeter-1
را تغییر دهید و سرویس BigQuery API را به همراه منبع محافظت شده project-1
محدود کنید.
بررسی اجرای محیطی سرویس
از project-2
، پرس و جوی زیر را مانند مرحله قبل در BigQuery Studio اجرا کنید:
SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;
نقض RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER
در کنترل های سرویس VPC رخ خواهد داد
گزارش حسابرسی تخلف در project-1
قرار خواهد گرفت، زیرا در آنجا تخلف برای عبور از محیط رخ داده است. گزارش ها را می توان با vpcServiceControlsUniqueId
مشاهده شده فیلتر کرد (شناسه منحصر به فرد مشاهده شده را جایگزین VPC_SC_DENIAL_UNIQUE_ID
کنید).
severity=ERROR
resource.type="audited_resource"
protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.metadata.vpcServiceControlsUniqueId="[*VPC_SC_DENIAL_UNIQUE_ID*]"
نقض یک egressViolations
است با:
-
principalEmail
: [حساب کاربری که درخواست را اجرا می کند] -
callerIp
: [آدرس IP عامل کاربر که پرس و جو را اجرا می کند]
"egressViolations": [
{
"targetResource": "projects/project-2",
"sourceType": "Resource",
"source": "projects/project-1",
"servicePerimeter": "accessPolicies/REDACTED/servicePerimeters/perimeter-1",
"targetResourcePermissions": [ "bigquery.jobs.create"]
} ],
5. رفع تخلف برای ایجاد کار BigQuery
این نمودار زمانی را نشان می دهد که یک اصلی یک پرس و جو از
project-2
برای یک مجموعه داده در project-1
اجرا می کند. عملیات ایجاد یک کار BigQuery، از پروژه مجموعه داده ( project-1
) در پروژهای که پرسوجو از آن اجرا میشود ( project-2
) با نقض خروجی کنترلهای سرویس VPC به دلیل محافظت از BigQuery API از perimeter-1
پیرامونی سرویس با شکست مواجه میشود. با در نظر گرفتن محیط، هیچ درخواست BigQuery API را نمی توان از project-1
به خارج از محیط یا خارج از محیط به سمت پروژه محافظت شده آغاز کرد. مگر اینکه توسط تنظیمات محیطی سرویس مجاز باشد.
نقض خروج را می توان با ایجاد یک قانون خروج برطرف کرد که بر اساس موارد زیر است:
- منبع (FROM): یعنی آدرس ایمیل کاربر و زمینه (به عنوان مثال: آدرس IP تماس گیرنده، وضعیت دستگاه، مکان و غیره)
- مقصد (TO): یعنی منبع، سرویس و روش یا مجوز هدف.
برای رفع نقض خروج مشاهده شده، یک قانون خروج ایجاد کنید که اجازه می دهد تا ترافیک به سمت targetResource ( project-2
) توسط حساب کاربری که پرس و جو ( user@example.com
) را در سرویس BigQuery و روش/مجوز bigquery.jobs.create
اجرا می کند، ایجاد کنید. .
رفتار مورد انتظار از قانون خروج پیکربندی شده:
- از | شناسه ها: فقط شناسه مشخص شده
user@example.com
باید اجازه عبور از مرز محیطی را داشته باشد. - به | پروژه ها: هویت مشخص شده تنها در صورتی می تواند از مرزهای محیطی عبور کند که مقصد پروژه مشخص شده
project-2
باشد. - به | خدمات: هویت مشخص شده تنها در صورتی می تواند ترافیک خارج از محیط را به سمت پروژه مشخص شده آغاز کند که فراخوانی API برای سرویس و روش مشخص شده باشد. در غیر این صورت، به عنوان مثال، اگر سرویس دیگری را امتحان کنند که توسط محیط سرویس محافظت می شود، عملیات مسدود می شود زیرا سایر سرویس ها مجاز نیستند.
ثابت: قانون خروج را آزمایش کنید
پس از برقراری قانون خروج، همان کوئری را اجرا کنید.
SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;
نقض دیگری رخ خواهد داد، این بار یک نقض ورودی NO_MATCHING_ACCESS_LEVEL
. تخلف جدید از نظر پروژه هدف و روش با تخلف اول متفاوت است.
نقض جدید یک نقض ورودی است
-
principalEmail
: [حساب کاربری که درخواست را اجرا می کند] -
callerIp
: [آدرس IP عامل کاربر که پرس و جو را اجرا می کند]
ingressViolations: [
0: {
servicePerimeter: "accessPolicies/REDACTED/servicePerimeters/perimeter-1"
targetResource: "projects/project-1"
targetResourcePermissions: [0: "bigquery.tables.getData"]}
]
نقض روش bigquery.tables.getData
به دلیل تماس API است که توسط کار BigQuery در تلاش برای دریافت داده از جدول BigQuery آغاز شده است.
6. رفع نقض برای دریافت داده های جدول BigQuery
یک قانون ورود، نقض ورود را برطرف میکند، در حالی که یک کنترل دقیق در مورد افرادی که مجاز به عبور از مرز محیطی سرویس هستند همراه با زمینه دسترسی مجاز، مانند پروژه منبع/هدف و روش API که میتوانند به آن دسترسی داشته باشند، ارائه میکند.
نقض ورود توسط یک قانون ورود رفع می شود که با:
- منبع (FROM): یعنی آدرس ایمیل کاربر و زمینه (به عنوان مثال: آدرس IP تماس گیرنده، وضعیت دستگاه، مکان و غیره)
- مقصد (TO): یعنی منبع، سرویس و روش یا مجوز هدف.
قانون ورود اجازه می دهد تا ترافیک به سمت project-1
توسط کاربر مشخص شده در سرویس و روش مشخص شده باشد.
رفتار مورد انتظار از قانون ورود پیکربندی شده:
- از | شناسه ها: فقط شناسه مشخص شده
user@example.com
باید اجازه عبور از مرز محیطی را داشته باشد. - به | پروژه ها: هویت مشخص شده تنها در صورتی می تواند از مرزهای محیطی عبور کند که مقصد پروژه مشخص شده
project-1
باشد. - به | خدمات: هویت مشخص شده تنها در صورتی می تواند ترافیک را در داخل محیط ایجاد کند که فراخوانی API برای BigQuery API و روش مشخص شده
bigquery.tables.getData
باشد.
اجرای پرس و جوی یکسان باید از این پس به طور مناسب بدون نقض کنترل های سرویس VPC عمل کند.
ما با موفقیت BigQuery API را در project-1
محدود کردهایم تا فقط توسط user@example.com
و نه user2@example.com
از آن استفاده شود.
این نمودار نشان می دهد که چگونه دو اصل مختلف سعی می کنند یک مجموعه داده را پرس و جو کنند. دسترسی توسط
user2@example.com
(خطوط آبی نقطهدار) توسط کنترلهای سرویس VPC ممنوع است، زیرا آنها مجاز به اجرای عملیات BigQuery از یا به سمت project-1
توسط پیکربندی محیطی سرویس نیستند. دسترسی توسط user@example.com
(خط جامد سبز) موفقیت آمیز است، زیرا توسط پیکربندیهای VPC Service Controls مجاز به انجام عملیات از و به سمت project-1
هستند.
7. ترافیک مجاز توسط محیط سرویس را بر اساس آدرس IP داخلی محدود کنید
پیکربندی فعلی به کاربر تعیینشده امکان میدهد تا از هر مکانی درخواستهایی را در BigQuery در project-1
اجرا کند. در هر نقطه از اینترنت، اگر به آنها اجازه IAM داده شود تا داده ها را جستجو کنند، و تا زمانی که از حساب خود استفاده می کنند. از منظر امنیتی، این بدان معناست که اگر حساب به خطر بیفتد، هر فردی که به حساب دسترسی پیدا کند میتواند بدون هیچ محدودیت اضافی به دادههای BigQuery دسترسی داشته باشد.
محدودیتهای بیشتر را میتوان با استفاده از سطح دسترسی در قوانین ورودی و خروجی برای مشخص کردن زمینه کاربر اعمال کرد. به عنوان مثال، شما می توانید اجازه دسترسی بر اساس IP منبع را در ارتباط با یک قانون ورودی پیکربندی شده قبلی که اجازه دسترسی بر اساس هویت تماس گیرنده را می دهد، بدهید. دسترسی از طریق IP منبع برای هر دو محدوده IP عمومی CIDR امکان پذیر است، مشروط بر اینکه مشتری کاربر یک IP عمومی به آن اختصاص داده باشد، یا با استفاده از یک آدرس IP داخلی اگر مشتری کاربر از پروژه Google Cloud کار می کند.
سطح دسترسی را با شرایط دسترسی به آدرس IP داخلی ایجاد کنید
در همان پوشه خط مشی دسترسی محدوده، صفحه Access Context Manager را برای ایجاد یک سطح دسترسی باز کنید.
- در صفحه Access Context Manager، CREATE ACCESS LEVEL را انتخاب کنید.
- در پنجره New Access Level:
- عنوانی را ارائه دهید: می توانید از
codelab-al
استفاده کنید. - در بخش شرایط، روی IP subnetworks کلیک کنید.
- تب Private IP را انتخاب کنید و روی SELECT VPC NETWORKS کلیک کنید.
- از صفحه افزودن شبکههای VPC ، میتوانید شبکه
default
را مرور و پیدا کنید یا به صورت دستی نام کامل شبکه را در قالب//compute.googleapis.com/projects/project-2/global/networks/default
وارد کنید. - روی ADD VPC Network کلیک کنید.
- روی SELECT IP SUBNETs کلیک کنید.
- منطقه ای را که نمونه VM در آن قرار دارد انتخاب کنید. برای این کد،
us-central1
است. - روی ذخیره کلیک کنید.
- عنوانی را ارائه دهید: می توانید از
ما یک سطح دسترسی ایجاد کردهایم که هنوز در هیچ محیطی یا سیاست ورودی/خروجی اعمال نمیشود.
سطح دسترسی را به قانون ورود اضافه کنید
برای اینکه کاربر مجاز توسط قانون ورود نیز در برابر سطح دسترسی تأیید شود، لازم است سطح دسترسی را در قانون ورود پیکربندی کنید. قانون ورود که دسترسی به داده های پرس و جو را مجاز می کند در perimeter-1
است. قانون ورود را تغییر دهید تا منبع را به عنوان سطح دسترسی codelab-al
تعریف کنید.
تست تنظیمات جدید
پس از اضافه شدن سطح دسترسی در قانون ورود، همان کوئری BigQuery با شکست مواجه خواهد شد مگر اینکه از کلاینت در شبکه VPC default
پروژه پروژه project-2
اجرا شود. برای تأیید این رفتار، در حالی که دستگاه نقطه پایانی به اینترنت متصل است، پرس و جو را از کنسول Google Cloud اجرا کنید. پرس و جو به طور ناموفق خاتمه می یابد، همراه با نشانه ای از نقض ورود.
همان پرس و جو را می توان از شبکه default
VPC که در project-2
قرار دارد اجرا کرد. به طور مشابه، اجرای همان کوئری BigQuery از یک نمونه Compute Engine واقع در project-2
با استفاده از default
شبکه VPC نیز با شکست مواجه خواهد شد. این به این دلیل است که قانون ورود همچنان به گونهای پیکربندی شده است که فقط به user@example.com
اصلی اجازه دهد. با این حال، VM از حساب خدمات پیش فرض Compute Engine استفاده می کند.
برای اجرای موفقیت آمیز همان فرمان از نمونه Compute Engine در project-2
، اطمینان حاصل کنید که:
- VM دارای دامنه دسترسی برای استفاده از BigQuery API است. این را می توان با انتخاب Allow full access to all Cloud APIs به عنوان محدوده دسترسی VM انجام داد.
- حساب سرویس متصل به VM به مجوزهای IAM نیاز دارد تا:
- ایجاد مشاغل BigQuery در
project-2
- داده های BigQuery را از جدول BigQuery واقع در
project-1
دریافت کنید
- ایجاد مشاغل BigQuery در
- حساب پیش فرض خدمات Compute Engine باید توسط قانون ورود و خروج مجاز باشد.
اکنون باید حساب سرویس پیشفرض Compute Engine را در قوانین ورودی (برای اجازه گرفتن دادهها از جدول BigQuery) و به قانون خروج (برای ایجاد مشاغل BigQuery) اضافه کنیم.
از یک نمونه Compute Engine در project-2
در شبکه default
VPC، دستور bq query زیر را اجرا کنید:
bq query --nouse_legacy_sql \
'SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;'
با پیکربندی فعلی، فرمان BigQuery تنها در صورتی موفق خواهد شد که:
- با استفاده از شبکه پیشفرض VPC در
project-2
، روی ماشین مجازی اجرا شود - واقع در منطقه مشخص شده
us-central1
(زیر شبکه IP)، و - با استفاده از حساب پیش فرض سرویس Compute Engine پیکربندی شده در محیط سرویس اجرا شود.
پرس و جو دستور BigQuery اگر از هر جای دیگری اجرا شود شکست خواهد خورد، از جمله:
- اگر در یک VM با استفاده از شبکه پیشفرض VPC در
project-2
اجرا شود، اما در منطقهای متفاوت از زیرشبکه اضافه شده در سطح دسترسی قرار دارد، یا - اگر توسط user
user@example.com
با مشتری کاربر در اینترنت اجرا شود.
این نمودار دسترسی آغاز شده توسط همان مدیر،
user@example.com
را از دو مکان مختلف نشان می دهد: اینترنت و یک نمونه Compute Engine. دسترسی به BigQuery مستقیماً از اینترنت (خطوط نقطهدار آبی) توسط کنترلهای سرویس VPC مسدود میشود، در حالی که دسترسی از VM (خطوط سبز سبز) - در حالی که جعل هویت حساب خدمات پیشفرض Compute Engine - مجاز است. دسترسی مجاز به این دلیل است که محیط سرویس برای اجازه دسترسی به منابع محافظت شده از آدرس IP داخلی پیکربندی شده است.
8. پاکسازی
در حالی که هیچ هزینه جداگانه ای برای استفاده از کنترل های سرویس VPC در زمانی که سرویس در حال استفاده نیست، دریافت نمی شود، تمیز کردن تنظیمات مورد استفاده در این آزمایشگاه بهترین روش است. همچنین میتوانید نمونه VM و مجموعه دادههای BigQuery یا پروژههای Google Cloud را حذف کنید تا از تحمیل هزینه جلوگیری کنید. با حذف پروژه Cloud، صورتحساب تمام منابع مورد استفاده در آن پروژه متوقف میشود.
- برای حذف نمونه VM ، مراحل زیر را انجام دهید:
- در کنسول Google Cloud، به صفحه نمونههای VM بروید.
- چک باکس سمت چپ نام نمونه VM را انتخاب کنید و سپس Delete را انتخاب کنید و سپس برای تایید دوباره روی Delete کلیک کنید.
- برای حذف محیط سرویس ، مراحل زیر را انجام دهید:
- در کنسول Google Cloud، Security و سپس VPC Service Controls را در سطحی که خط مشی دسترسی محدوده است، در این مورد، در سطح پوشه انتخاب کنید.
- در صفحه VPC Service Controls، در ردیف جدول مربوط به محیطی که می خواهید حذف کنید، روی Delete کلیک کنید.
- برای حذف سطح دسترسی ، مراحل زیر را انجام دهید:
- در کنسول Google Cloud، صفحه Access Context Manager را در محدوده پوشه باز کنید.
- در شبکه، ردیفی را برای سطح دسترسی که میخواهید حذف کنید مشخص کنید، منوی سه نقطه را انتخاب کنید و سپس حذف را انتخاب کنید.
- برای خاموش کردن پروژه ها مراحل زیر را انجام دهید:
- در کنسول Google Cloud، به صفحه IAM & Admin Settings پروژه ای که می خواهید حذف کنید بروید.
- در صفحه IAM & Admin Settings، Shutdown را انتخاب کنید.
- شناسه پروژه را وارد کرده و Shutdown anyway را انتخاب کنید.
9. تبریک می گویم!
در این کد لبه، یک محیط VPC Service Controls ایجاد کردید، آن را اجرا کردید و عیبیابی کرد.
بیشتر بدانید
می توانید سناریوهای زیر را نیز بررسی کنید:
- پس از اینکه پروژه توسط کنترل های سرویس VPC محافظت شد، همان پرس و جو را روی مجموعه داده عمومی اجرا کنید.
-
project-2
در همان محیطproject-1
اضافه کنید. -
project-2
را در محیط خودش اضافه کنید وproject-1
در محیط فعلی نگه دارید. - کوئری ها را برای به روز رسانی داده ها در جدول اجرا کنید، نه فقط برای بازیابی داده ها.
مجوز
این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.