VPC Service Controls – Lớp học lập trình về biện pháp bảo vệ BigQuery I

1. Giới thiệu

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách bảo vệ BigQuery API bằng Chế độ kiểm soát dịch vụ VPC. Lớp học lập trình bắt đầu với việc không có dịch vụ API nào được bảo vệ bằng phạm vi dịch vụ, cho phép chạy truy vấn trên các tập dữ liệu công khai và kết quả được lưu trong bảng dự án. Truy vấn chạy trong một dự án và bảng (nơi kết quả được lưu) được tạo trong một dự án khác, bắt chước cách thiết lập trong đó dữ liệu có thể được lưu trữ trong một dự án nhưng cần được truy cập bằng một dự án khác.

Tiếp theo, chúng tôi sẽ giới thiệu một phạm vi dịch vụ để bảo vệ dự án dữ liệu. Bạn sẽ tìm hiểu cách khắc phục các lỗi vi phạm đã quan sát được bằng quy tắc nhập và quy tắc đầu ra, sau đó thêm một cấp truy cập để hạn chế quyền truy cập bằng địa chỉ IP nội bộ. Mục tiêu của lớp học lập trình này là:

  • Hiểu cách khắc phục các lỗi vi phạm về lưu lượng vào và lưu lượng ra bằng các quy tắc nhập và xuất tương ứng.
  • Hiểu lý do xảy ra một lỗi vi phạm cụ thể.
  • Phân tích phạm vi của bản sửa lỗi vi phạm được áp dụng.
  • Sửa đổi bản sửa lỗi (quy tắc vào / ra) để thay đổi phạm vi của lỗi bằng cách tận dụng lựa chọn cho phép lưu lượng truy cập từ các địa chỉ IP nội bộ trong mạng VPC bằng cách sử dụng các cấp truy cập.

2. Thiết lập tài nguyên và yêu cầu

Trước khi bắt đầu

Trong lớp học lập trình này, chúng tôi giả định rằng bạn đã biết:

Thiết lập

Quá trình thiết lập ban đầu của chúng ta được thiết kế như sau:

Thiết kế ban đầu với phạm vi dịch vụ không bảo vệ API.

Tạo chu vi dịch vụ thông thường

Trong lớp học lập trình này, chúng ta sẽ sử dụng một chu vi dịch vụ thông thường bảo vệ project-1.

Tạo máy ảo Compute Engine

Trong lớp học lập trình này, chúng ta sẽ dùng 1 thực thể của Compute Engine trong project-2, nằm trong us-central1 và sử dụng mạng VPC mặc định có tên là default.

Chi phí

Bạn cần bật tính năng thanh toán trong bảng điều khiển Google Cloud để sử dụng tài nguyên/API trên đám mây. Bạn nên tắt các tài nguyên đã sử dụng để tránh phát sinh thanh toán ngoài lớp học lập trình này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Các tài nguyên phát sinh chi phí là phiên bản BigQuery và Compute Engine. Bạn có thể ước tính chi phí bằng công cụ tính giá của BigQuerycông cụ tính giá của Compute Engine.

3. Quyền truy cập vào BigQuery mà không có các quy định hạn chế về dịch vụ VPC Service Controls

Truy vấn tập dữ liệu công khai và lưu kết quả trong project-1

  1. Truy cập vào project-2project-1 để xác minh xem bạn có thể truy cập vào BigQuery API hay không bằng cách chuyển đến trang BigQuery Studio. Bạn nên làm như vậy vì ngay cả khi project-1 nằm trong một phạm vi dịch vụ, thì phạm vi vẫn sẽ chưa bảo vệ bất kỳ dịch vụ nào.
  2. Từ project-2, hãy chạy truy vấn sau để truy vấn một tập dữ liệu công khai.
SELECT  name, SUM(number) AS total
FROM  `bigquery-public-data.usa_names.usa_1910_2013`
GROUP BY   name
ORDER BY total DESC
LIMIT 10;

Sau khi chạy truy vấn tới tập dữ liệu công khai (trong khi vẫn ở trong project-2):

  1. Nhấp vào Lưu kết quả rồi chọn Bảng BigQuery. (tham khảo ảnh chụp màn hình bên dưới). Lưu kết quả BigQuery.
  2. Chọn project-1 làm dự án đích.
  3. Đặt tên cho Tập dữ liệu là codelab_dataset. (Chọn TẠO TẬP DỮ LIỆU MỚI, trừ phi sử dụng một tập dữ liệu hiện có). Chọn dự án đích trong khi lưu kết quả BigQuery.
  4. Đặt tên cho bảng là: codelab-table.
  5. Nhấp vào Lưu.

Dữ liệu tập dữ liệu công khai đã được lưu trữ thành công trong project-1 nhờ thực thi truy vấn của project-2.

Đã lưu tập dữ liệu truy vấn trong project-1 từ project-2

Trong khi vẫn ở trong BigQuery Studio của project-2, hãy chạy truy vấn sau để chọn dữ liệu trong:

  • Dự án: project-1
  • Tập dữ liệu: codelab_dataset
  • Bảng: codelab-table
SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;

Truy vấn này sẽ chạy thành công vì cả project-2project-1 đều không bị hạn chế sử dụng BigQuery. Người dùng được phép truy cập vào BigQuery ở bất cứ đâu, miễn là người dùng có các quyền quản lý danh tính và quyền truy cập (IAM) thích hợp.

Thiết lập lớp học lập trình mà không sử dụng phạm vi dịch vụ của VPC Service Controls. Sơ đồ này minh hoạ quy trình khi một truy vấn chính truy vấn một tập dữ liệu BigQuery. Mỗi truy vấn BigQuery bắt đầu một công việc BigQuery, sau đó công việc này sẽ thực hiện hoạt động thực tế, trong trường hợp này là truy xuất dữ liệu. Quyền truy cập chính được thể hiện qua một thực thể Compute Engine và từ Internet, trong khi truy vấn từ một tập dữ liệu công khai và từ một dự án riêng biệt trên Google Cloud. Quá trình truy vấn dữ liệu (GetData) đã thành công mà không bị VPC Service Controls chặn.

4. Bảo vệ API BigQuery trong Dự án tập dữ liệu nguồn

Sửa đổi cấu hình của phạm vi perimeter-1 và hạn chế dịch vụ BigQuery API cùng với tài nguyên được bảo vệ là project-1.

Định cấu hình phạm vi dịch vụ

Xác minh thực thi phạm vi dịch vụ

Từ project-2, hãy chạy truy vấn sau trong BigQuery Studio, như ở bước trước:

SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;

Sẽ xảy ra lỗi vi phạm RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER Biện pháp kiểm soát dịch vụ đám mây riêng ảo (VPC)

Lỗi vi phạm về biện pháp kiểm soát dịch vụ VPC xuất ra

Nhật ký kiểm tra lỗi vi phạm sẽ nằm trong project-1, vì đó là nơi xảy ra lỗi vi phạm khi vượt ra ngoài phạm vi. Bạn có thể lọc nhật ký bằng vpcServiceControlsUniqueId được quan sát (thay thế VPC_SC_DENIAL_UNIQUE_ID bằng mã nhận dạng duy nhất được quan sát).

severity=ERROR
resource.type="audited_resource"
protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.metadata.vpcServiceControlsUniqueId="[*VPC_SC_DENIAL_UNIQUE_ID*]"

Lỗi vi phạm là egressViolations trong đó:

  • principalEmail: [tài khoản người dùng đang chạy truy vấn]
  • callerIp: [Địa chỉ IP của tác nhân người dùng đang chạy truy vấn]
     "egressViolations": [
       {
         "targetResource": "projects/project-2",
         "sourceType": "Resource",
         "source": "projects/project-1",
         "servicePerimeter": "accessPolicies/REDACTED/servicePerimeters/perimeter-1",
         "targetResourcePermissions": [ "bigquery.jobs.create"]
       }      ],

5. Khắc phục lỗi vi phạm để tạo công việc BigQuery

Không thể tạo lưu lượng truy cập ra vào BigQuery. Sơ đồ này minh hoạ thời điểm một đối tượng chính chạy một truy vấn từ project-2 cho một tập dữ liệu trong project-1. Thao tác tạo công việc BigQuery, từ dự án tập dữ liệu (project-1) trong dự án chạy truy vấn (project-2) sẽ không thành công do vi phạm đầu ra của VPC Service Controls do phạm vi dịch vụ perimeter-1 bảo vệ BigQuery API. Với phạm vi đã áp dụng, bạn sẽ không thể thực hiện yêu cầu BigQuery API từ project-1 ra bên ngoài phạm vi hay được bắt đầu ra ngoài phạm vi về phía dự án được bảo vệ; trừ khi được cho phép bởi cấu hình vành đai dịch vụ.

Bạn có thể khắc phục lỗi vi phạm về lượng khí ra bằng cách tạo một quy tắc về lượng khí ra dựa trên:

  • nguồn (FROM): cụ thể là địa chỉ email và ngữ cảnh của người dùng (ví dụ: địa chỉ IP của người gọi, trạng thái thiết bị, vị trí, v.v.)
  • đích đến (TO): cụ thể là tài nguyên, dịch vụ, phương thức hoặc quyền mục tiêu.

Để khắc phục lỗi vi phạm về lưu lượng vào mà đã quan sát được, hãy tạo một quy tắc đầu ra cho phép tài khoản người dùng đang chạy truy vấn (user@example.com) trên dịch vụ BigQuery và phương thức/ quyền bigquery.jobs.create cho phép lưu lượng truy cập đến targetResource (project-2).

Cấu hình Khắc phục lỗi vi phạm xuất phát.

Hành vi dự kiến của quy tắc đầu ra được định cấu hình:

  • TỪ | Danh tính: chỉ có danh tính được chỉ định user@example.com mới được phép vượt qua ranh giới chu vi.
  • ĐẾN | dự án: danh tính được chỉ định chỉ có thể vượt qua ranh giới chu vi nếu đích đến là dự án được chỉ định project-2.
  • ĐẾN | Dịch vụ: danh tính được chỉ định có thể bắt đầu lưu lượng truy cập ra ngoài phạm vi, chỉ hướng vào dự án được chỉ định nếu lệnh gọi API dành cho dịch vụ và phương thức được chỉ định. Nếu không, ví dụ: nếu họ thử một dịch vụ khác được bảo vệ bằng phạm vi dịch vụ, thì thao tác sẽ bị chặn vì các dịch vụ khác không được phép.

Kiểm thử bản sửa lỗi: Quy tắc thoát

Sau khi quy tắc xuất dữ liệu được thiết lập, hãy chạy cùng một truy vấn.

SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;

Một lỗi vi phạm khác sẽ xảy ra, lần này là lỗi vi phạm vào NO_MATCHING_ACCESS_LEVEL. Vi phạm mới này khác với lần đầu tiên vi phạm, về dự án mục tiêu và phương pháp.

Lỗi vi phạm Ingress VPC Service Controls

Vi phạm mới là vi phạm lưu lượng truy cập với

  • principalEmail: [tài khoản người dùng đang chạy truy vấn]
  • callerIp: [Địa chỉ IP của tác nhân người dùng đang chạy truy vấn]
ingressViolations: [
0: {
 servicePerimeter: "accessPolicies/REDACTED/servicePerimeters/perimeter-1"
 targetResource: "projects/project-1"
 targetResourcePermissions: [0: "bigquery.tables.getData"]}
 ]

Lỗi vi phạm đối với phương thức bigquery.tables.getData là do một lệnh gọi API do công việc BigQuery khởi tạo đang cố gắng lấy dữ liệu từ bảng BigQuery.

6. Khắc phục lỗi vi phạm để nhận dữ liệu bảng BigQuery

Quy tắc lưu lượng vào khắc phục lỗi vi phạm lưu lượng vào, đồng thời cung cấp khả năng kiểm soát chi tiết về những người được phép vượt qua ranh giới phạm vi dịch vụ cùng với bối cảnh của lượt truy cập được phép, chẳng hạn như dự án nguồn/ mục tiêu và phương thức API mà những người dùng đó có thể truy cập.

Lỗi vi phạm lưu lượng vào được khắc phục bằng quy tắc lưu lượng vào được định cấu hình bằng:

  • nguồn (FROM): cụ thể là địa chỉ email và ngữ cảnh của người dùng (ví dụ: địa chỉ IP của người gọi, trạng thái thiết bị, vị trí, v.v.)
  • đích đến (TO): cụ thể là tài nguyên, dịch vụ, phương thức hoặc quyền mục tiêu.

Quy tắc nhập dữ liệu sẽ cho phép người dùng đã chỉ định hướng lưu lượng truy cập đến project-1 trên dịch vụ và phương thức đã chỉ định.

Khắc phục lỗi vi phạm của lưu lượng vào

Hành vi dự kiến từ quy tắc nhập dữ liệu đã định cấu hình:

  • TỪ | Danh tính: chỉ có danh tính được chỉ định user@example.com mới được phép vượt qua ranh giới chu vi.
  • ĐẾN | dự án: danh tính được chỉ định chỉ có thể vượt qua ranh giới chu vi nếu đích đến là dự án được chỉ định project-1.
  • ĐẾN | Dịch vụ: danh tính được chỉ định có thể bắt đầu lưu lượng truy cập bên trong phạm vi chỉ khi lệnh gọi API dành cho BigQuery API và phương thức được chỉ định bigquery.tables.getData.

Từ đó, việc thực thi truy vấn giống hệt nhau sẽ hoạt động đúng cách mà không vi phạm các biện pháp kiểm soát dịch vụ đám mây riêng ảo (VPC).

Chúng tôi đã hạn chế thành công API BigQuery trong project-1 để chỉ user@example.com mới dùng được chứ không phải user2@example.com.

VPC Service Controls phạm vi bảo vệ BigQuery API Sơ đồ này minh hoạ cách hai thành phần chính cố gắng truy vấn cùng một tập dữ liệu. VPC Service Controls không cho phép truy cập vào user2@example.com (các đường chấm màu xanh dương) vì các dịch vụ này không được phép chạy hoạt động BigQuery từ hoặc hướng tới project-1 theo cấu hình phạm vi dịch vụ. Đã truy cập thành công bằng user@example.com (đường liền nét màu xanh lục) vì các cấu hình này được cấu hình VPC Service Controls cho phép thực hiện các thao tác từ và hướng tới project-1.

7. Hạn chế lưu lượng truy cập được phép theo Chu vi dịch vụ dựa trên Địa chỉ IP nội bộ

Cấu hình hiện tại cho phép người dùng được chỉ định chạy truy vấn trên BigQuery trong project-1 từ bất kỳ vị trí nào; ở bất cứ đâu trên Internet, nếu họ được cấp quyền IAM để truy vấn dữ liệu và miễn là họ sử dụng tài khoản của mình. Từ góc độ bảo mật, điều này ngụ ý rằng nếu tài khoản bị xâm phạm, bất kỳ cá nhân nào có được quyền truy cập vào tài khoản đều có thể truy cập vào dữ liệu BigQuery mà không có bất kỳ hạn chế nào khác.

Bạn có thể triển khai các quy tắc hạn chế khác bằng cách tận dụng cấp truy cập trong các quy tắc nhập và ra để xác định bối cảnh của người dùng. Ví dụ: bạn có thể cho phép quyền truy cập dựa trên IP nguồn cùng với quy tắc nhập dữ liệu đã định cấu hình trước đó cho phép truy cập theo danh tính người gọi. Bạn có thể truy cập theo IP nguồn cho cả hai dải IP CIDR công khai, miễn là ứng dụng của người dùng được gán một IP công khai hoặc bằng cách sử dụng địa chỉ IP nội bộ nếu ứng dụng của người dùng hoạt động trong một dự án Google Cloud.

Tạo cấp truy cập bằng điều kiện truy cập địa chỉ IP nội bộ

Trong cùng thư mục chính sách về quyền truy cập trong phạm vi, hãy mở trang Trình quản lý ngữ cảnh truy cập để tạo cấp truy cập.

  1. Trên trang Trình quản lý ngữ cảnh truy cập, hãy chọn TẠO CẤP TRUY CẬP.
  2. Trong ngăn Cấp truy cập mới:
    1. Cung cấp tiêu đề: bạn có thể sử dụng codelab-al.
    2. Trong phần Điều kiện, hãy nhấp vào Mạng con IP.
    3. Chọn thẻ IP riêng tư rồi nhấp vào CHỌN MẠNG VPC.
    4. Trong ngăn Add VPC Networks (Thêm mạng VPC), bạn có thể duyệt qua và tìm mạng default hoặc tự nhập tên mạng đầy đủ ở định dạng //compute.googleapis.com/projects/project-2/global/networks/default.
    5. Nhấp vào THÊM mạng VPC.
    6. Nhấp vào SELECT SUBNET (CHỌN địa chỉ IP).
    7. Chọn khu vực đặt thực thể máy ảo. Đối với lớp học lập trình này, đó là us-central1.
    8. Nhấp vào LƯU.

Chúng tôi đã tạo một cấp truy cập, cấp này vẫn không được thực thi trên bất kỳ chính sách nào cho phạm vi hoặc lưu lượng vào/ra.

Cấp truy cập được định cấu hình bằng Mạng con IP

Thêm cấp truy cập vào quy tắc lưu lượng vào

Để thực thi việc xác minh người dùng mà quy tắc lưu vào đã cho phép cũng phải được xác minh dựa trên cấp truy cập, bạn cần phải định cấu hình cấp truy cập trong quy tắc lưu lượng vào. Quy tắc nhập vào cho phép truy cập vào dữ liệu truy vấn nằm trong perimeter-1. Thay đổi quy tắc nhập dữ liệu để xác định nguồn làm cấp truy cập codelab-al.

Cấp truy cập khi dùng mạng VPC

Kiểm thử cấu hình mới

Sau khi được thêm cấp truy cập trong quy tắc vào, truy vấn BigQuery đó sẽ không thành công trừ phi được thực thi từ máy khách trong mạng VPC default cho dự án project-2. Để xác minh hành vi này, hãy thực thi truy vấn trên bảng điều khiển Google Cloud trong khi thiết bị đầu cuối đang kết nối với Internet. Truy vấn sẽ chấm dứt không thành công, kèm theo dấu hiệu vi phạm lưu lượng truy cập.

Bạn có thể chạy cùng một truy vấn từ mạng VPC default, nằm ở project-2. Tương tự, việc thực thi cùng một truy vấn BigQuery từ một thực thể Compute Engine nằm trong project-2 bằng mạng VPC default cũng sẽ không thành công. Lý do là quy tắc nhập dữ liệu vẫn được định cấu hình để chỉ cho phép user@example.com chính. Tuy nhiên, máy ảo đang sử dụng tài khoản dịch vụ mặc định của Compute Engine.

Để chạy thành công cùng một lệnh trên thực thể Compute Engine trong project-2,hãy đảm bảo rằng:

  • Máy ảo có phạm vi truy cập để sử dụng BigQuery API. Bạn có thể thực hiện việc này bằng cách chọn phạm vi truy cập máy ảo là Allow full access to all Cloud APIs (Cho phép toàn quyền truy cập vào tất cả Cloud API).
  • Tài khoản dịch vụ được liên kết với máy ảo cần có quyền IAM để:
    • Tạo công việc trên BigQuery trong project-2
    • Lấy dữ liệu BigQuery từ bảng BigQuery ở project-1
  • Tài khoản dịch vụ mặc định của Compute Engine cần được cho phép theo quy tắc nhập và xuất.

Bây giờ, chúng ta cần thêm tài khoản dịch vụ mặc định của Compute Engine trong các quy tắc nhập dữ liệu (để cho phép lấy dữ liệu từ bảng BigQuery) và quy tắc đầu ra (để cho phép tạo công việc BigQuery).

Cấu hình phạm vi dịch vụ VPC Service Controls kèm theo các cấp truy cập

Từ một thực thể Compute Engine trong project-2 trên mạng VPC default, hãy chạy lệnh truy vấn bq sau:

bq query --nouse_legacy_sql \
'SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;'

Với cấu hình hiện tại, lệnh BigQuery sẽ chỉ thành công nếu:

  • chạy trên máy ảo bằng mạng VPC mặc định trong project-2, và
  • nằm trong vùng us-central1 được chỉ định (mạng con IP) và
  • chạy bằng tài khoản dịch vụ mặc định của Compute Engine được định cấu hình trong phạm vi dịch vụ.

Truy vấn lệnh BigQuery sẽ không thành công nếu chạy từ bất kỳ nơi nào khác, bao gồm:

  • nếu máy ảo chạy trên mạng VPC mặc định trong project-2 nhưng nằm ở một khu vực khác với mạng con được thêm vào ở cấp truy cập, hoặc
  • nếu được chạy bởi người dùng user@example.com với ứng dụng của người dùng trên Internet.

Giới hạn dịch vụ cho phép tài khoản dịch vụ GCE mặc định truy cập. Sơ đồ này minh hoạ quyền truy cập do cùng một đối tượng chính user@example.com khởi tạo ở hai vị trí khác nhau: Internet và thực thể Compute Engine. VPC Service Controls cho phép truy cập vào BigQuery ngay trên Internet (đường chấm màu xanh dương), đồng thời cho phép truy cập từ máy ảo (đường kẻ liền màu xanh lục) trong khi mạo danh tài khoản dịch vụ mặc định của Compute Engine. Quyền truy cập được phép là do phạm vi dịch vụ được định cấu hình để cho phép truy cập vào các tài nguyên được bảo vệ từ một địa chỉ IP nội bộ.

8. Dọn dẹp

Mặc dù bạn không phải trả phí riêng cho việc sử dụng dịch vụ VPC Service Controls khi không sử dụng dịch vụ này, nhưng tốt nhất là bạn nên dọn dẹp chế độ thiết lập được sử dụng trong phòng thí nghiệm này. Bạn cũng có thể xoá thực thể máy ảo và tập dữ liệu BigQuery hoặc các dự án trên Google Cloud để tránh phát sinh phí. Khi bạn xoá dự án trên Google Cloud, hệ thống sẽ ngừng tính phí cho tất cả tài nguyên dùng trong dự án đó.

  • Để xoá phiên bản máy ảo, hãy hoàn tất các bước sau:
    • Trong bảng điều khiển Google Cloud, hãy truy cập vào trang phiên bản máy ảo.
    • Chọn hộp đánh dấu ở bên trái tên phiên bản máy ảo, chọn Delete (Xoá) rồi nhấp vào Delete (Xoá) lần nữa để xác nhận. Xoá phiên bản thực thể Compute Engine.
  • Để xoá phạm vi dịch vụ, hãy hoàn tất các bước sau:
    • Trong bảng điều khiển Google Cloud, hãy chọn Bảo mật, sau đó chọn Chế độ kiểm soát dịch vụ VPC ở cấp mà trong đó có giới hạn phạm vi của chính sách truy cập ở cấp thư mục.
    • Trên trang VPC Service Controls, trong hàng của bảng tương ứng với phạm vi mà bạn muốn xoá, hãy nhấp vào Delete (Xoá).
  • Để xoá Cấp truy cập, hãy hoàn tất các bước sau:
    • Trong bảng điều khiển của Google Cloud, hãy mở trang Access Context Manager ở phạm vi Thư mục.
    • Trong lưới, hãy xác định hàng tương ứng với cấp truy cập mà bạn muốn xoá, chọn trình đơn có biểu tượng ba dấu chấm, rồi chọn Xoá.
  • Để ngừng dự án, hãy hoàn tất các bước sau:
    • Trong bảng điều khiển Google Cloud, hãy chuyển đến IAM & Trang Cài đặt quản trị của dự án mà bạn muốn xoá.
    • Trên IAM và trang Cài đặt quản trị, chọn Tắt.
    • Nhập mã dự án rồi chọn Vẫn tắt.

9. Xin chúc mừng!

Trong lớp học lập trình này, bạn đã tạo một phạm vi VPC Service Controls, thực thi và khắc phục sự cố.

Tìm hiểu thêm

Bạn cũng có thể tìm hiểu những tình huống sau:

  • Chạy cùng một truy vấn trên tập dữ liệu công khai, sau khi dự án được bảo vệ bằng VPC Service Controls.
  • Thêm project-2 trong cùng một chu vi với project-1.
  • Thêm project-2 trong chu vi riêng và giữ project-1 trong chu vi hiện tại.
  • Chạy truy vấn để cập nhật dữ liệu trong bảng, chứ không chỉ để truy xuất dữ liệu.

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.