Ngân hàng đề — Microsoft Azure Database Administrator

Tìm thấy 217 câu.

Câu 101
You have an instance of SQL Server on Azure Virtual Machines that has a database named DB1.
You plan to implement Azure SQL Data Sync for DB1.
Which isolation level should you configure?
  1. A SERIALIZABLE
  2. B SNAPSHOT
  3. C READ UNCOMMITTED
  4. D READ COMMITTED
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi tập trung vào việc triển khai Azure SQL Data Sync cho một cơ sở dữ liệu tên DB1 đang chạy trên SQL Server instance trên Azure Virtual Machines (VM).
Azure SQL Data Sync là dịch vụ của Microsoft Azure dùng để đồng bộ hóa dữ liệu hai chiều giữa các cơ sở dữ liệu SQL Server (on-premises hoặc trên cloud) và Azure SQL Database, giúp đảm bảo tính nhất quán dữ liệu giữa các môi trường khác nhau.

Vấn đề cốt lõi: Khi triển khai Data Sync, bạn cần cấu hình isolation level (mức độ cô lập giao dịch) phù hợp cho DB1 để tránh các xung đột đồng bộ hóa, như "update conflicts" hoặc "tombstone table overflow". Isolation level quyết định cách các giao dịch đọc/ghi dữ liệu mà không bị ảnh hưởng lẫn nhau, và Data Sync yêu cầu bắt buộc một mức độ cô lập cụ thể để hoạt động ổn định.

Câu hỏi kiểm tra kiến thức về yêu cầu kỹ thuật của Azure SQL Data Sync (cập nhật đến năm 2026, theo tài liệu Microsoft Azure mới nhất: vẫn giữ nguyên yêu cầu SNAPSHOT isolation từ các phiên bản trước).

📘 Tài liệu tham khảo:

✅ Đáp án đúng: SNAPSHOT

Lý do lựa chọn:
Azure SQL Data Sync bắt buộc phải cấu hình isolation level là SNAPSHOT cho tất cả các database tham gia đồng bộ (bao gồm SQL Server on Azure VM). Lý do là SNAPSHOT sử dụng snapshot isolation dựa trên row versioning, giúp đọc dữ liệu từ một "ảnh chụp" nhất quán tại thời điểm giao dịch bắt đầu, tránh blocking và phantom reads. Điều này ngăn chặn các xung đột đồng bộ hóa (như insert/update/delete conflicts) vì Data Sync dựa vào change tracking và tombstone tables để theo dõi thay đổi. Nếu không dùng SNAPSHOT, sync sẽ thất bại hoặc gây lỗi dữ liệu không nhất quán.
🛠️ Cách cấu hình: Sử dụng lệnh SQL ALTER DATABASE DB1 SET ALLOW_SNAPSHOT_ISOLATION ON; ALTER DATABASE DB1 SET READ_COMMITTED_SNAPSHOT ON;.

📋 Giải thích tất cả các phương án (đúng/sai)

  • SERIALIZABLE ❌ SAI:
    SERIALIZABLE là mức cô lập cao nhất, khóa toàn bộ phạm vi đọc để tránh phantom reads, nhưng nó gây blocking nghiêm trọng và deadlock cao trong môi trường đồng bộ hóa liên tục như Data Sync. Azure SQL Data Sync không hỗ trợ vì không tương thích với cơ chế change tracking dựa trên versioning – dẫn đến sync thất bại hoặc hiệu suất kém.

  • SNAPSHOT ✅ ĐÚNG:
    Như đã giải thích ở trên, đây là yêu cầu bắt buộc của Azure SQL Data Sync để đảm bảo đọc nhất quán mà không blocking, hỗ trợ row versioning hoàn hảo cho việc theo dõi thay đổi dữ liệu. Không có thay đổi nào đến năm 2026.

  • READ UNCOMMITTED ❌ SAI:
    READ UNCOMMITTED cho phép dirty reads (đọc dữ liệu chưa commit), dẫn đến dữ liệu không nhất quán và lỗi nghiêm trọng trong Data Sync (như sync conflicts hoặc dữ liệu "ma"). Data Sync cấm mức này vì không đảm bảo tính toàn vẹn giao dịch.

  • READ COMMITTED ❌ SAI:
    READ COMMITTED (mặc định của SQL Server) sử dụng shared locks, dễ gây blocking và non-repeatable reads. Data Sync yêu cầu nâng cấp lên SNAPSHOT (bật READ_COMMITTED_SNAPSHOT ON) để tránh vấn đề này; nếu dùng READ COMMITTED thuần, sync sẽ báo lỗi hoặc thất bại.

Câu 102
You deploy an instance of SQL Server on Azure Virtual Machines named VM1.

You need to create a SQL Server Agent job that will rebuild indexes of the databases hosted on VM1. The solution must use the principle of least privilege.

What should you create first?
  1. A a local Windows account
  2. B a user-assigned managed identity in Azure AD
  3. C a system-assigned managed identity in Azure AD
  4. D an Elastic Job agent
Xem giải thích

🧩 Phân tích chi tiết câu hỏi

📖 Nội dung câu hỏi:
Câu hỏi mô tả tình huống bạn đã triển khai một instance SQL Server trên Azure Virtual Machines (VM) có tên VM1. Nhiệm vụ là tạo một SQL Server Agent job để rebuild indexes (xây dựng lại chỉ mục) cho các cơ sở dữ liệu (databases) đang được lưu trữ trên VM1. Giải pháp phải tuân thủ nguyên tắc least privilege (quyền hạn tối thiểu), nghĩa là chỉ cấp quyền cần thiết nhất để tránh rủi ro bảo mật.
🛠️ Yêu cầu chính: Bạn cần xác định nên tạo gì đầu tiên (What should you create first?) để thực hiện job này một cách an toàn và hiệu quả trên Azure VM với SQL Server.
Đây là chủ đề liên quan đến bảo mật và automation trên Azure SQL Server on VMs, tận dụng các tính năng native của Azure như Managed Identity để authenticate mà không cần lưu trữ mật khẩu, phù hợp với best practices mới nhất đến năm 2026 (Azure SQL IaaS extension v2 và AAD integration).

✅ Đáp án đúng và lý do lựa chọn

Đáp án đúng: a system-assigned managed identity in Azure AD
Lý do:

  • Để chạy SQL Server Agent job trên Azure VM với quyền hạn tối thiểu, bạn cần enable Managed Identity cho VM1 để SQL Server Agent có thể authenticate với Azure AD (Entra ID) mà không cần tài khoản Windows hoặc service account truyền thống (tránh quản lý password).
  • System-assigned managed identity được tạo trực tiếp gắn liền với VM1 (tự động lifecycle cùng VM), là bước đầu tiên đơn giản nhất cho single VM, hỗ trợ SQL Agent jobs rebuild indexes local databases qua AAD token.
  • Điều này tuân thủ least privilege vì identity chỉ có quyền scoped cho VM cụ thể, có thể assign role-based access (RBAC) như SQL Agent Operator. Theo docs Azure 2026, đây là recommended way cho SQL on VMs với Azure extension.
  • Quy trình: Tạo system-assigned MI → Assign role (e.g., SQL Server login với AAD) → Enable SQL Agent → Tạo job.

🔍 Giải thích tất cả các phương án (đúng/sai)

Dưới đây là phân tích từng lựa chọn, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá ✅ (đúng) hoặc ❌ (sai), kèm giải thích chi tiết bằng tiếng Việt:

  • a local Windows account ❌
    Giải thích sai: Tạo tài khoản Windows local trên VM để chạy SQL Agent job (qua proxy account) không tuân thủ least privilege vì phải quản lý password thủ công, dễ bị lộ (không tích hợp AAD). Không phải bước đầu tiên khuyến nghị trên Azure; dễ bị tấn công privilege escalation. Phù hợp legacy on-prem, không phải Azure best practice 2026.

  • a user-assigned managed identity in Azure AD ❌
    Giải thích sai: User-assigned MI linh hoạt cho multiple VMs/share, nhưng không phải first step cho single VM1 (phức tạp hơn system-assigned). Cần tạo riêng MI rồi assign vào VM, không đơn giản bằng system-assigned tự động. Vẫn tốt cho least privilege nhưng câu hỏi ưu tiên "first" và context single VM.

  • a system-assigned managed identity in Azure AD ✅
    Giải thích đúng: Như đã nêu ở phần đáp án. Đây là bước đầu tiên cần thiết để enable AAD auth cho SQL Agent trên VM, hỗ trợ rebuild indexes securely. Tích hợp seamless với Azure SQL IaaS Agent extension (v2+), zero credential management.

  • an Elastic Job agent ❌
    Giải thích sai: Elastic Job agent dùng cho Azure SQL Database/Managed Instance/Hyperscale (serverless job orchestration), không áp dụng cho SQL Server on VMs. Không hỗ trợ local VM jobs như rebuild indexes; gây lỗi khi deploy trên VM1. Feature này dành cho PaaS, không phải IaaS VMs (theo AWS? – câu hỏi Azure, nhưng Elastic Jobs là Azure-specific).

📘 Tài liệu tham khảo (cập nhật đến 2026)

Câu 103
You plan to build a structured streaming solution in Azure Databricks. The solution will count new events in five-minute intervals and report only events that arrive during the interval.
The output will be sent to a Delta Lake table.
Which output mode should you use?
  1. A complete
  2. B append
  3. C update
Xem giải thích

🧩 Giải thích nội dung câu hỏi

Câu hỏi tập trung vào việc xây dựng một giải pháp structured streaming trên Azure Databricks. Giải pháp này sẽ:

  • Đếm số lượng sự kiện mới (new events) theo các khoảng thời gian 5 phút.
  • Chỉ báo cáo những sự kiện đến trong khoảng thời gian đó (không bao gồm dữ liệu cũ hoặc tích lũy).
  • Kết quả đầu ra được gửi đến một bảng Delta Lake.

📌 Yêu cầu chính: Chọn output mode phù hợp trong Structured Streaming của Spark (hỗ trợ trên Azure Databricks). Output mode quyết định dữ liệu nào sẽ được ghi ra sink (ở đây là Delta Lake) mỗi khi trigger chạy. Với kiến thức cập nhật đến năm 2026 (Spark 3.5+ và Databricks Runtime 15.x+), Structured Streaming hỗ trợ các mode này cho các aggregation theo window với event-time.

✅ Đáp án đúng: append

Lý do lựa chọn:

  • Mode append chỉ ghi ra những hàng dữ liệu mới được thêm vào kết quả từ lần trigger trước (chỉ events mới trong window 5 phút).
  • Hoàn hảo cho trường hợp đếm new events theo interval và chỉ báo cáo events trong interval đó, không rewrite toàn bộ dữ liệu cũ. Khi kết hợp với watermark (khuyến nghị cho late data), nó đảm bảo tính chính xác cao trên Delta Lake.
  • Trong Azure Databricks, append hỗ trợ tối ưu cho Delta sink với streaming aggregations, tránh overhead lớn.

🛠️ Giải thích chi tiết tất cả các phương án

  • complete ❌ Sai:
    Mode này ghi ra toàn bộ bảng kết quả đã cập nhật mỗi trigger, bao gồm tất cả aggregations từ đầu (cumulative counts). Không phù hợp vì sẽ lặp lại dữ liệu cũ ngoài interval 5 phút, gây lãng phí lưu trữ trên Delta Lake và không khớp yêu cầu "only events that arrive during the interval".

  • append ✅ Đúng:
    Như đã giải thích ở trên, chỉ append dữ liệu mới từ window hiện tại, lý tưởng cho counting new events theo interval mà không ảnh hưởng dữ liệu lịch sử. Hỗ trợ đầy đủ cho event-time windows trên Delta Lake (Databricks Runtime 15.x+).

  • update ❌ Sai:
    Mode này chỉ ghi ra những hàng đã thay đổi so với trigger trước (updated rows trong aggregation). Với counting new events, nó có thể ghi counts nếu chúng thay đổi, nhưng không đảm bảo "only new events during interval" vì vẫn có thể bao gồm updates từ late data hoặc không append đầy đủ cho pure append scenarios. Không tối ưu cho immutable event reporting trên Delta.

📘 Tài liệu tham khảo

Hy vọng phân tích này giúp bạn nắm vững! 🚀 Nếu cần demo code, hãy cho biết thêm chi tiết.

Câu 104
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You have SQL Server 2019 on an Azure virtual machine.
You are troubleshooting performance issues for a query in a SQL Server instance.
To gather more information, you query sys.dm_exec_requests and discover that the wait type is PAGELATCH_UP and the wait_resource is 2:3:905856.
You need to improve system performance.
Solution: You shrink the transaction log file.
Does this meet the goal?
  1. A Yes
  2. B No
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi thuộc dạng series questions trong kỳ thi chứng chỉ (như Microsoft Azure hoặc SQL Server certification), nơi mỗi câu hỏi trình bày một tình huống giống nhau nhưng đưa ra giải pháp khác nhau. Người dùng KHÔNG thể quay lại câu hỏi sau khi trả lời, và không hiển thị trong màn hình review.

Tình huống cụ thể:

  • Bạn có SQL Server 2019 chạy trên Azure Virtual Machine (VM).
  • Đang troubleshoot vấn đề hiệu suất của một query.
  • Query sys.dm_exec_requests cho thấy:
    • Wait type: PAGELATCH_UP (latch chờ trên page với chế độ UP - update, thường liên quan đến contention trên các page phân bổ không gian như PFS, GAM, SGAM trong tempdb hoặc database chính, không phải I/O disk).
    • Wait_resource: 2:3:905856 (Database ID = 2 thường là tempdb, File ID = 3, Page ID = 905856 - chỉ ra contention trên page cụ thể trong tempdb).
  • Mục tiêu: Cải thiện hiệu suất hệ thống.
  • Giải pháp đề xuất: Shrink transaction log file (thu nhỏ file log giao dịch).
  • Câu hỏi: Giải pháp này có đạt mục tiêu không? (Yes/No).

Nguyên nhân gốc rễ vấn đề (dựa trên kiến thức SQL Server 2019-2022, cập nhật đến 2026):
PAGELATCH_UP KHÔNG phải wait liên quan đến transaction log. Nó xảy ra do nhiều session tranh chấp latch trên page non-buffer (như allocation pages), thường ở tempdb do tạo nhiều temp objects (temp tables, sorts, hashes). Shrink log chỉ ảnh hưởng đến kích thước log file, không giải quyết contention allocation. 🛠️

📘 Tài liệu tham khảo:

✅ Đáp án đúng: No

Lý do chọn đáp án đúng (bằng tiếng Việt):
Giải pháp shrink transaction log file KHÔNG giải quyết vấn đề PAGELATCH_UP vì:

  • Wait type này do contention trên latch pages (không phải log I/O). Shrink log chỉ giảm kích thước log, có thể làm tệ hơn performance do tăng fragmentation và VLF (Virtual Log Files).
  • Giải pháp đúng thường là: Tăng số file tempdb (1 file/core CPU), đặt kích thước fixed, hoặc optimize query tránh temp objects.
  • Kết quả: Không meet the goal - hiệu suất không cải thiện.

📋 Giải thích tất cả các phương án

  • Yes ❌ SAI:
    Phương án này không đúng vì shrink transaction log KHÔNG liên quan đến PAGELATCH_UP. Wait này xuất phát từ latch contention trên allocation pages (như page 905856 trong tempdb DBID=2), thường do workload tạo nhiều tempdb objects. Shrink log chỉ ảnh hưởng waits như WRITELOG hoặc LOGMGR, và có thể gây hại bằng cách tăng autogrowth/fragmentation. Không cải thiện performance, thậm chí làm chậm hơn!

  • No ✅ ĐÚNG:
    Phương án này hoàn toàn chính xác vì giải pháp đề xuất không đạt mục tiêu. PAGELATCH_UP yêu cầu xử lý tempdb contention (ví dụ: thêm data files cho tempdb với kích thước equal, kích hoạt trace flag 1117/1118 nếu cần). Shrink log là "anti-pattern" trong SQL Server, Microsoft không khuyến nghị trừ trường hợp khẩn cấp và phải rebuild index sau. Hiệu suất vẫn kém nếu không fix gốc rễ. 🛠️

Câu 105
You have an Azure subscription that contains a logical SQL server named Server1. The master database of Server1 contains a user named User1.
You need to ensure that User1 can create databases on Server1.
Which database role should you assign to User1?
  1. A db_owner
  2. B dbmanager
  3. C dbo
  4. D db_ddladmin
Xem giải thích

🛠️ Phân tích câu hỏi trắc nghiệm Azure SQL Database bởi Microsoft Azure Database Administrator

Chào bạn! 👋 Tôi là Microsoft Azure Database Administrator với kinh nghiệm chuyên sâu về Azure SQL Database và Azure SQL Managed Instance. Dưới đây là phân tích chi tiết và rõ ràng theo yêu cầu của bạn. Lưu ý: Câu hỏi này thuần túy thuộc Azure SQL Database (không liên quan AWS), dựa trên kiến thức cập nhật mới nhất đến năm 2026 từ Microsoft (Azure SQL Database version hỗ trợ server-level roles như dbmanager không thay đổi cơ bản từ 2021-2026).

🧩 Giải thích nội dung câu hỏi

Câu hỏi mô tả tình huống: Bạn có một Azure subscription chứa logical SQL server tên Server1 (đây là Azure SQL Database server, không phải on-premises SQL Server). Trong master database của Server1 có một user tên User1.
Yêu cầu chính: Cần cấp quyền cho User1 có thể tạo database mới trên Server1 (tức là CREATE DATABASE trên server level).
📌 Điểm quan trọng: Quyền này phải được assign ở master database (server-level role), không phải trong một database cụ thể. User1 cần quyền server-level để tạo DB mới trên logical server.

✅ Đáp án đúng: dbmanager

Lý do lựa chọn:
Role dbmanager là fixed server-level role trong Azure SQL Database (master database). Nó cấp quyền cho user tạo, thay đổi, xóa và khôi phục database trên logical server. Đây là quyền chính xác và tối thiểu cần thiết để User1 tạo database mới trên Server1 mà không cần quyền sysadmin cao cấp hơn.
🛠️ Cách assign: ALTER SERVER ROLE dbmanager ADD MEMBER [User1]; (chạy trong master DB).
✅ Hoàn toàn phù hợp với yêu cầu!

📋 Phân tích tất cả các phương án (đúng/sai)

Dưới đây là giải thích chi tiết từng lựa chọn, giữ nguyên văn bản gốc bằng tiếng Anh. Phân tích dựa trên fixed database roles và server-level roles trong Azure SQL Database (cập nhật 2026: Không thay đổi quyền cơ bản).

  • ❌ db_owner
    Giải thích sai: Đây là fixed database role (database-level), chỉ cấp quyền full control bên trong một database cụ thể (như ALTER, CREATE TABLE, DELETE...). Không cấp quyền tạo database mới trên server level. Assign db_owner chỉ ảnh hưởng đến DB hiện tại, không giúp User1 tạo DB trên Server1.

  • ✅ dbmanager
    Giải thích đúng: Như đã nêu ở trên, đây là server-level role duy nhất trong lựa chọn phù hợp để tạo database. User1 sẽ có quyền CREATE DATABASE trên toàn logical server.

  • ❌ dbo
    Giải thích sai: dbo (database owner) là principal đặc biệt trong một database cụ thể, tương đương db_owner nhưng không phải role để assign trực tiếp cho user ở master DB. Nó không cấp quyền server-level như tạo DB mới. Assign dbo chỉ hữu ích trong context của một DB đã tồn tại.

  • ❌ db_ddladmin
    Giải thích sai: Đây là fixed database role (database-level), chỉ cho phép thực hiện DDL statements (như CREATE/ALTER/DROP objects) bên trong database hiện tại. Không liên quan đến việc tạo database mới trên server.

📘 Tài liệu tham khảo (cập nhật 2026)

Nếu bạn cần script T-SQL mẫu hoặc lab thực hành, hãy cho tôi biết nhé! 🚀

Câu 106
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You have SQL Server 2019 on an Azure virtual machine.
You are troubleshooting performance issues for a query in a SQL Server instance.
To gather more information, you query sys.dm_exec_requests and discover that the wait type is PAGELATCH_UP and the wait_resource is 2:3:905856.
You need to improve system performance.
Solution: You change the data file for the master database to autogrow by 10 percent.
Does this meet the goal?
  1. A Yes
  2. B No
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi thuộc dạng case study (phần câu hỏi liên kết), thường xuất hiện trong các kỳ thi chứng chỉ như AZ-305 hoặc DP-300 của Microsoft Azure. Tình huống:

  • Bạn đang quản lý SQL Server 2019 chạy trên Azure Virtual Machine (VM).
  • Đang troubleshoot vấn đề hiệu suất của một query bằng cách query sys.dm_exec_requests.
  • Phát hiện wait type là PAGELATCH_UP và wait_resource là 2:3:905856.
    • Giải mã wait_resource:
      • 2: ID của database master (database hệ thống mặc định).
      • 3: ID của file (thường là log file của master database).
      • 905856: ID của page cụ thể trong file đó.
  • PAGELATCH_UP là loại wait latch UP (update latch), xảy ra khi có contention (xung đột) trên các page không được buffer (non-buffer pages), thường liên quan đến allocation pages (như GAM, SGAM, PFS, IAM) hoặc log allocation trong master database. Nguyên nhân phổ biến: Nhiều session kết nối đồng thời gây tranh chấp trên log tail hoặc allocation structures của master DB, dẫn đến performance kém.
  • Mục tiêu: Cải thiện hiệu suất hệ thống.
  • Giải pháp đề xuất: Thay đổi data file của master database để autogrow by 10 percent (tự động mở rộng 10% khi đầy).
  • Câu hỏi: Giải pháp này có đạt mục tiêu không? (Yes/No).

📘 Tài liệu tham khảo:

✅ Đáp án đúng: No

Lý do lựa chọn: Giải pháp chỉ thay đổi autogrow của data file (file dữ liệu chính) master DB không giải quyết gốc rễ vấn đề PAGELATCH_UP. Wait đang xảy ra trên file ID 3 (thường là log file của master), do contention trên log allocation pages hoặc extent allocation khi nhiều connection tạo session. Autogrow data file không ảnh hưởng đến log file hoặc latch contention trên master log. Giải pháp đúng cần pre-size log file master lớn hơn, sử dụng trace flag 1117/1118, hoặc tối ưu tempdb/master allocation (như multiple data files cho tempdb).

🛠️ Giải thích tất cả các phương án

  • Yes ❌ SAI: Phương án này không đạt mục tiêu. Thay đổi autogrow data file master (thường là mdf) chỉ giúp tránh fragmentation khi file lớn dần, nhưng không liên quan trực tiếp đến PAGELATCH_UP trên log file (file 3). Contention PAGELATCH_UP ở master thường do log tail growth hoặc allocation bitmap pages bị tranh chấp, không phải data file size. Autogrow 10% còn có thể gây fragmentation thêm nếu kích hoạt thường xuyên, làm chậm hơn.

  • No ✅ ĐÚNG: Phương án này không meet the goal, như giải thích trên. Đây là đáp án chính xác vì giải pháp đề xuất không target đúng wait type và resource. Các giải pháp thay thế hiệu quả:

    • Pre-grow master log file (ví dụ: ALTER DATABASE master MODIFY FILE (NAME = mastlog, SIZE = 10GB)).
    • Áp dụng TF 1118 (giảm PAGELATCH trên PFS/GAM).
    • Tối ưu tempdb (multiple files equal size) vì thường liên quan gián tiếp.
    • Kiểm tra Azure VM sizing (CPU/IO credits nếu Bursting VM).

🔍 Lưu ý thêm: Trong Azure SQL VM (IAAS), bạn có thể dùng Azure Monitor hoặc Query Store để deep dive waits. Luôn test trên dev trước khi apply production!

Câu 107 Chọn nhiều đáp án
A data engineer creates a table to store employee information for a new application. All employee names are in the US English alphabet. All addresses are locations in the United States. The data engineer uses the following statement to create the table.
CREATE TABLE dbo.Employee
(
    EmployeeID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL,
    FirstName VARCHAR(100) NOT NULL,
    LastName VARCHAR(100) NOT NULL,
    Title VARCHAR(100) NULL,
    LastHireDate DATETIME NULL,
    StreetAddress1 VARCHAR(500) NOT NULL,
    StreetAddress2 VARCHAR(500) NOT NULL,
    StreetAddress3 VARCHAR(500) NOT NULL,
    City VARCHAR(200) NOT NULL,
    StateName VARCHAR(20) NOT NULL,
    Salary VARCHAR(20) NULL,
    PhoneNumber VARCHAR(20) NOT NULL
)

You need to recommend changes to the data types to reduce storage and improve performance.
Which two actions should you recommend? Each correct answer presents part of the solution.
NOTE: Each correct selection is worth one point.
  1. A Change Salary to the money data type.
  2. B Change PhoneNumber to the float data type.
  3. C Change LastHireDate to the datetime2(7) data type.
  4. D Change PhoneNumber to the bigint data type.
  5. E Change LastHireDate to the date data type.
Xem giải thích

🧩 Phân tích nội dung câu hỏi

Câu hỏi này thuộc lĩnh vực quản trị cơ sở dữ liệu SQL Server (không phải AWS, mà là Microsoft SQL Server, thường dùng trên Azure SQL Database). Một data engineer đã tạo bảng dbo.Employee để lưu thông tin nhân viên, với dữ liệu chủ yếu là tiếng Anh Mỹ và địa chỉ tại Mỹ. Bảng sử dụng các kiểu dữ liệu như VARCHAR cho tên, địa chỉ, lương (Salary), số điện thoại (PhoneNumber), và DATETIME cho ngày thuê (LastHireDate).

Vấn đề chính: Các kiểu dữ liệu hiện tại (như VARCHAR(20) cho Salary và DATETIME cho LastHireDate) không tối ưu, dẫn đến lãng phí bộ nhớ lưu trữ (storage) và giảm hiệu suất truy vấn/performance (do kích thước lớn hơn cần thiết, index kém hiệu quả hơn).
Yêu cầu: Đề xuất 2 thay đổi kiểu dữ liệu để giảm storage (bytes nhỏ hơn) và cải thiện performance (truy vấn nhanh hơn, tính toán chính xác hơn). Đây là câu hỏi trắc nghiệm multi-select (mỗi lựa chọn đúng đáng 1 điểm).

Dữ liệu đặc trưng: Tên/địa chỉ chỉ alphabet Anh, địa chỉ Mỹ → Không cần Unicode. Lương là số tiền, ngày thuê chỉ cần ngày (không giờ).

✅ Đáp án đúng (2 lựa chọn)

Hai hành động đúng là:

  1. Change Salary to the money data type.
  2. Change LastHireDate to the date data type.

Lý do chọn:

  • Những thay đổi này giảm storage đáng kể (từ 21 bytes xuống 8 bytes cho Salary; từ 8 bytes xuống 3 bytes cho LastHireDate) và tăng performance (kiểu số tiền cho phép tính toán chính xác như SUM/AVERAGE mà không cần CAST, kiểu date hỗ trợ index tốt hơn cho truy vấn ngày). Phù hợp dữ liệu Mỹ (không cần precision cao cho giờ/phút).

🛠️ Giải thích chi tiết từng phương án (dùng kiến thức SQL Server 2022 - cập nhật đến 2026)

Dưới đây là phân tích tất cả 5 lựa chọn, giữ nguyên văn bản gốc tiếng Anh. Mỗi cái được đánh giá ✅ (đúng, giảm storage/performance tốt) hoặc ❌ (sai, không đạt mục tiêu hoặc tệ hơn).

  • ✅ Change Salary to the money data type.
    Giải thích đúng: Salary hiện là VARCHAR(20) (tối đa 21 bytes, lưu string như '100000.00'), dễ lỗi khi tính toán (phải CAST sang số). Chuyển sang money (fixed 8 bytes, range -922,337,203,685,477.5808 đến 922,337,203,685,477.5807) giảm storage ~60%, hỗ trợ phép tính tiền tệ chính xác (ROUND tự động 4 chữ số thập phân), cải thiện performance cho query lương. Lý tưởng cho dữ liệu Mỹ. 📉 Storage tiết kiệm lớn!

  • ❌ Change PhoneNumber to the float data type.
    Giải thích sai: PhoneNumber là VARCHAR(20) (chuỗi như '(123) 456-7890'). float (8 bytes) dành cho số thực gần đúng (scientific notation), không phù hợp phone vì mất độ chính xác (rounding error, ví dụ 1234567890 có thể thành 1.23456789e9), không lưu ký tự đặc biệt/dấu cách. Không giảm storage hiệu quả, tệ hơn cho performance (không index tốt cho LIKE search). 🚫 Sai hoàn toàn!

  • ❌ Change LastHireDate to the datetime2(7) data type.
    Giải thích sai: LastHireDate hiện DATETIME (fixed 8 bytes, precision 3.33ms, range 1753-9999). datetime2(7) cũng 8 bytes (precision 100ns), chỉ cải thiện độ chính xác nhưng không giảm storage (thậm chí có thể lớn hơn nếu variable length). Không đạt mục tiêu, performance tương đương hoặc kém hơn cho chỉ ngày. Nếu cần giờ thì ok, nhưng câu hỏi ưu tiên ngày → Không recommend. 📏 Không thay đổi storage!

  • ❌ Change PhoneNumber to the bigint data type.
    Giải thích sai: bigint (8 bytes fixed) dành số nguyên lớn (range -9.22e18 đến 9.22e18). Phone US thường 10 chữ số (như 1234567890), có thể fit nhưng mất format (dấu cách, ngoặc, leading zero), không tính toán số học (phone chỉ lưu trữ). VARCHAR(20) linh hoạt hơn cho format, bigint không giảm storage nhiều so với CHAR(10) tốt hơn (10 bytes). Performance kém cho search text. 🔢 Không tối ưu!

  • ✅ Change LastHireDate to the date data type.
    Giải thích đúng: DATETIME (8 bytes) lưu cả ngày+giờ, thừa nếu chỉ cần ngày thuê (ví dụ '2023-01-15'). date chỉ 3 bytes (range 0001-01-01 đến 9999-12-31, precision ngày), giảm storage 62%, index hiệu quả hơn cho BETWEEN/DATEPART query. Hoàn hảo cho dữ liệu không giờ. Performance tăng tốc truy vấn lịch sử thuê. 🗓️ Tiết kiệm tối đa!

📘 Tài liệu tham khảo (cập nhật SQL Server 2022/Azur SQL 2026)

Kết luận: Áp dụng 2 thay đổi đúng sẽ tối ưu bảng ngay! 🚀 Nếu cần script ALTER TABLE, hãy hỏi thêm.

Câu 108 Chọn nhiều đáp án
You have an Azure AD tenant and a logical Microsoft SQL server named SQL1 that hosts several Azure SQL databases.

You plan to assign Azure AD users permissions to the databases automatically by using Azure Automation.

You need to create the required Automation accounts.

Which two accounts should you create? Each correct answer presents part of the solution.

NOTE: Each correct selection is worth one point.
  1. A From the Azure Active Directory admin center create a service principal.
  2. B From the Azure Active Directory admin center, create a user-assigned managed identity for SQL1.
  3. C On SQL1, create a SQL user in the databases.
  4. D On SQL1, create a SQL login.
  5. E From the Azure Active Directory admin center, create an external identity.
Xem giải thích

🧩 Phân tích chi tiết câu hỏi trắc nghiệm

📘 Nội dung câu hỏi:
Câu hỏi mô tả tình huống bạn có một Azure AD tenant (thư mục Azure Active Directory) và một logical Microsoft SQL server tên là SQL1 đang lưu trữ nhiều Azure SQL databases. Bạn dự định tự động gán quyền truy cập cho các người dùng Azure AD vào các cơ sở dữ liệu này bằng cách sử dụng Azure Automation (dịch vụ tự động hóa quy trình trên Azure). Nhiệm vụ là tạo các tài khoản cần thiết (Automation accounts) để thực hiện việc này. Đây là câu hỏi chọn nhiều đáp án đúng (mỗi đáp án đúng chiếm 1 điểm), yêu cầu chọn hai tài khoản phù hợp.

Mục tiêu chính là thiết lập xác thực Azure AD cho service principal hoặc identity để runbook trong Azure Automation có thể kết nối và thay đổi quyền trong Azure SQL databases một cách tự động (ví dụ: CREATE USER FROM EXTERNAL PROVIDER và GRANT permissions). Điều này đòi hỏi hai yếu tố: một identity để Automation sử dụng (như service principal) và một user trong database để thực thi lệnh SQL.

✅ Đáp án đúng (hai lựa chọn):

  • From the Azure Active Directory admin center create a service principal.
  • On SQL1, create a SQL user in the databases.

🛠️ Lý do chọn hai đáp án đúng:
Để Azure Automation runbook tự động gán quyền Azure AD users cho databases trên SQL1, bạn cần:

  1. Service principal từ Azure AD làm identity chính cho Automation account (hoặc runbook) authenticate với Azure SQL server và databases. Service principal cho phép runbook sử dụng token Azure AD để kết nối mà không cần password.
  2. SQL user trong databases (tạo bằng lệnh CREATE USER [principal-name] FROM EXTERNAL PROVIDER;) để service principal có quyền thực thi các lệnh ALTER USER/GRANT trên từng database. Không có SQL user này, service principal không thể modify permissions ở mức database.
    Kết hợp hai yếu tố này, Automation có thể chạy script PowerShell hoặc Python để tự động hóa quy trình. (Kiến thức cập nhật đến 2025-2026: Không thay đổi lớn trong Azure SQL Entra ID auth - trước đây gọi Azure AD).

🔍 Giải thích chi tiết từng phương án (giữ nguyên văn bản gốc)

  • ✅ From the Azure Active Directory admin center create a service principal.
    Đúng! 🟢 Service principal là identity không phải người dùng, được tạo từ Azure AD (nay là Microsoft Entra ID) với app registration và client secret/certificate. Nó cho phép Azure Automation authenticate với Azure SQL qua Entra ID token, thực hiện các tác vụ tự động như gán quyền. Đây là bước đầu tiên cần thiết cho runbook.

  • ❌ From the Azure Active Directory admin center, create a user-assigned managed identity for SQL1.
    Sai! 🔴 User-assigned managed identity có thể dùng cho services như Automation, nhưng option chỉ định "for SQL1" (logical SQL server), mà Azure SQL server không hỗ trợ managed identity trực tiếp (chỉ hỗ trợ Entra ID admin hoặc service principal). Managed identity thường dùng cho VM/App Service, không phải để gán quyền tự động ở đây.

  • ✅ On SQL1, create a SQL user in the databases.
    Đúng! 🟢 Sau khi có service principal, phải tạo SQL user ở mức database (không phải server) bằng lệnh CREATE USER [sp-name] FROM EXTERNAL PROVIDER;. User này map với service principal, cho phép runbook từ Automation có quyền GRANT/ALTER trên users Azure AD trong database. Bắt buộc cho từng database trên SQL1.

  • ❌ On SQL1, create a SQL login.
    Sai! 🔴 SQL login là tài khoản xác thực SQL Authentication ở mức server (CREATE LOGIN), không liên quan đến Azure AD. Azure SQL chỉ hỗ trợ Entra ID cho automation như thế này; SQL login không dùng được với service principal hoặc Automation.

  • ❌ From the Azure Active Directory admin center, create an external identity.
    Sai! 🔴 "External identity" không phải khái niệm chuẩn trong Azure AD/Entra ID cho trường hợp này. Nó có thể ám chỉ guest user hoặc B2B, nhưng không dùng để Automation authenticate với SQL. Service principal hoặc managed identity mới phù hợp.

📚 Tài liệu tham khảo (cập nhật mới nhất 2025-2026)

Hy vọng phân tích này giúp bạn hiểu rõ! 🚀 Nếu cần script mẫu runbook, hãy hỏi thêm.

Câu 109
You have a SQL pool in Azure Synapse that contains a table named dbo.Customers. The table contains a column name Email.
You need to prevent nonadministrative users from seeing the full email addresses in the Email column. The users must see values in a format of aXXX@XXXX.com instead.
What should you do?
  1. A From the Azure portal, set a mask on the Email column.
  2. B From the Azure portal, set a sensitivity classification of Confidential for the Email column.
  3. C From Microsoft SQL Server Management Studio, set an email mask on the Email column.
  4. D From Microsoft SQL Server Management Studio, grant the SELECT permission to the users for all the columns in the dbo.Customers table except Email.
Xem giải thích

🛠️ Phân Tích Câu Hỏi Trắc Nghiệm Về Azure Synapse SQL Pool

Chào bạn! Tôi là Microsoft Azure Database Administrator chuyên trách quản lý và tối ưu hóa các dịch vụ dữ liệu trên Azure, bao gồm Azure Synapse Analytics. Hôm nay, tôi sẽ phân tích chi tiết câu hỏi trắc nghiệm bạn cung cấp theo đúng yêu cầu. Chủ đề tập trung vào Dynamic Data Masking (DDM) trong Azure Synapse dedicated SQL pools (phiên bản cập nhật mới nhất đến năm 2026, hỗ trợ đầy đủ DDM cho việc che giấu dữ liệu nhạy cảm như email). 🧩

📖 Giải Thích Nội Dung Câu Hỏi

Câu hỏi mô tả tình huống:

  • Bạn có một SQL pool (dedicated SQL pool) trong Azure Synapse Analytics chứa bảng dbo.Customers.
  • Bảng này có cột Email lưu trữ địa chỉ email đầy đủ (ví dụ: alice.smith@example.com).
  • Yêu cầu chính: Ngăn người dùng không phải admin (nonadministrative users) nhìn thấy email đầy đủ. Thay vào đó, họ chỉ thấy định dạng aXXX@XXXX.com (che giấu phần chính, giữ ký tự đầu và domain cơ bản).
  • Mục tiêu: Sử dụng cơ chế Dynamic Data Masking (DDM) để masking dữ liệu thời gian thực khi query, mà không thay đổi dữ liệu gốc hoặc quyền truy cập cột. Admin vẫn thấy đầy đủ, user thường chỉ thấy masked.
    ✅ Đây là tính năng bảo mật chuẩn của Azure Synapse (từ năm 2020 và cập nhật liên tục đến 2026), giúp tuân thủ GDPR/ HIPAA mà không cần code phức tạp.

✅ Đáp Án Đúng Và Lý Do

Đáp án đúng: From the Azure portal, set a mask on the Email column.
Lý do:

  • Trong Azure portal, bạn có thể truy cập Synapse workspace > SQL pools > Data masking để thiết lập email masking trực tiếp trên cột Email.
  • DDM sẽ tự động áp dụng quy tắc email() mask, chuyển email thành dạng aXXX@XXXX.com cho user đủ điều kiện (non-admin). Admin và role được authorize sẽ thấy đầy đủ.
  • ✅ Ưu điểm: Dễ dàng, không cần T-SQL phức tạp, hỗ trợ realtime khi SELECT query. Áp dụng ngay lập tức trên dedicated SQL pools (cập nhật 2026 vẫn giữ nguyên). Không ảnh hưởng performance lớn.

🔍 Giải Thích Từng Phương Án (Đúng/Sai)

Dưới đây là phân tích tất cả 4 phương án, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá ✅ (đúng) hoặc ❌ (sai), kèm giải thích chi tiết bằng tiếng Việt:

  • ✅ From the Azure portal, set a mask on the Email column.
    Giải thích: Đây là cách chuẩn và chính xác nhất. Azure portal cung cấp giao diện Data masking blade để chọn cột Email, áp dụng email mask function. User non-admin sẽ thấy masked value khi query (ví dụ: SELECT Email FROM dbo.Customers). Hoạt động realtime, linh hoạt authorize qua role/permissions. 🛡️ Hoàn hảo cho yêu cầu!

  • ❌ From the Azure portal, set a sensitivity classification of Confidential for the Email column.
    Giải thích: Sai hoàn toàn. Sensitivity classification (phân loại độ nhạy cảm) chỉ dùng để gán label như Confidential cho dữ liệu (qua portal > SQL pool > Data classification). Nó giúp scan và báo cáo, nhưng KHÔNG masking dữ liệu. User vẫn thấy email đầy đủ nếu có SELECT permission. ❌ Chỉ hỗ trợ compliance, không che giấu realtime.

  • ❌ From Microsoft SQL Server Management Studio, set an email mask on the Email column.
    Giải thích: Không khả dụng. SSMS không hỗ trợ thiết lập DDM mask trực tiếp cho Azure Synapse SQL pools (khác với Azure SQL DB). Bạn chỉ dùng T-SQL ALTER COLUMN để add mask (nhưng câu hỏi chỉ định "set an email mask" qua SSMS, không có UI như vậy). Portal là cách chính thức, SSMS chỉ connect query. ❌ Sai công cụ và phương pháp.

  • ❌ From Microsoft SQL Server Management Studio, grant the SELECT permission to the users for all the columns in the dbo.Customers table except Email.
    Giải thích: Sai mục tiêu. Việc grant SELECT chỉ cho các cột trừ Email sẽ ẩn cột hoàn toàn (user thấy NULL hoặc lỗi nếu query Email). Không tạo masking dạng aXXX@XXXX.com, mà loại bỏ cột khỏi kết quả. ❌ Không linh hoạt, phá vỡ schema, không đáp ứng "users must see values in a format of aXXX@XXXX.com".

📘 Tài Liệu Tham Khảo (Cập Nhật 2026)

Nếu bạn cần hướng dẫn thực hành (steps chi tiết với screenshot) hoặc câu hỏi tương tự, hãy cho tôi biết nhé! 🚀

Câu 110
You have an on-premises Microsoft SQL Server 2019 instance named SQL1 that hosts a database named db1. You have an Azure subscription that contains an
Azure SQL managed instance named MI1 and an Azure Storage account named storage1.
You plan to migrate db1 to MI1 by using the backup and restore process.
You need to ensure that you can back up db1 to storage1. The solution must meet the following requirements:
✑ Use block blob storage.
✑ Maximize security.
What should you do on storage1?
  1. A Generate a shared access signature (SAS).
  2. B Create an access policy.
  3. C Rotate the storage keys.
  4. D Enable infrastructure encryption.
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi xoay quanh việc migrate cơ sở dữ liệu db1 từ máy chủ Microsoft SQL Server 2019 on-premises (tên SQL1) sang Azure SQL Managed Instance (tên MI1) bằng quy trình backup và restore. Bạn có một Azure Storage account tên storage1 để lưu trữ file backup dưới dạng block blob storage (loại blob mặc định phù hợp cho file SQL backup lớn).

Yêu cầu chính:

  • ✅ Sử dụng block blob storage (đảm bảo container/blob hỗ trợ block blobs, không phải page hoặc append blobs).
  • 🔒 Tối đa hóa bảo mật (maximize security): Cần cung cấp quyền truy cập an toàn, hạn chế, không expose storage account key đầy đủ quyền.

Vấn đề cốt lõi: Để SQL Server on-premises backup trực tiếp đến Azure Blob URL (qua lệnh BACKUP DATABASE TO URL), bạn phải cấu hình credential trên SQL1 với SAS token hoặc storage key. Tuy nhiên, để maximize security, Microsoft khuyến nghị sử dụng SAS thay vì storage account key vì SAS cho phép quyền granular, thời hạn hết hạn, và không cần chia sẻ key toàn cục.

Lưu ý cập nhật 2026: Theo tài liệu Azure SQL Managed Instance và SQL Server 2022 (tương thích 2019), quy trình backup/restore đến Azure Blob vẫn yêu cầu SAS cho security cao nhất. Không có thay đổi lớn từ Azure Storage v2 (GA từ 2018) đến các tính năng mới như Customer-Managed Keys (CMK) hoặc Immutable Storage, nhưng SAS vẫn là best practice cho backup scenarios. (Nguồn: Microsoft Docs - Backup to URL, Azure SQL Managed Instance Migration).

✅ Đáp án đúng: Generate a shared access signature (SAS)

Lý do lựa chọn:

  • SAS (Shared Access Signature) tạo token truy cập tạm thời, granular cho blob/container cụ thể (ví dụ: quyền Write + Create + Delete cho backup/restore), hỗ trợ block blob trực tiếp.
  • Tối đa hóa security: Không expose storage account key (có quyền admin toàn bộ), tránh rủi ro nếu key bị lộ. SAS có thể set expiry time (ví dụ: 7 ngày), IP restrictions, và protocol HTTPS only.
  • Quy trình: Trên storage1, tạo SAS cho container (service=blob, resource=container/blob, permissions=wcd – write/create/delete), sau dùng URL + SAS trong SQL credential (CREATE CREDENTIAL ... WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'sv=...sig=...') để backup BACKUP DATABASE db1 TO URL = 'https://storage1.blob.core.windows.net/backup/db1.bak'.
  • Hoàn hảo khớp yêu cầu: Block blob (SAS hỗ trợ), security cao nhất cho one-time migration.

📋 Giải thích tất cả các phương án (đúng/sai)

  • ✅ Generate a shared access signature (SAS):
    Đúng 🥇. Như phân tích trên, SAS là giải pháp chính thức từ Microsoft để backup SQL to Azure Blob với security tối ưu. Không cần cấu hình thêm, chỉ generate SAS trên portal/CLI và dùng ngay. Best practice cho migration on-prem sang Managed Instance.

  • ❌ Create an access policy:
    Sai ❌. Access policy chỉ dùng để quản lý SAS (assign quyền cho SAS token), không trực tiếp enable backup. Bạn vẫn cần generate SAS sau khi tạo policy. Không giải quyết "maximize security" độc lập, và không liên quan trực tiếp đến block blob access.

  • ❌ Rotate the storage keys:
    Sai ❌. Rotate keys là good practice định kỳ (qua Azure portal hoặc PowerShell), nhưng không enable backup ngay lập tức. Nếu dùng storage key cho credential, security kém hơn SAS (key có quyền rộng, khó revoke granular). Không khớp yêu cầu security cao cho block blob backup.

  • ❌ Enable infrastructure encryption:
    Sai ❌. Infrastructure encryption (miễn phí, at-rest bằng Microsoft-managed keys) bảo vệ dữ liệu lưu trên Azure infrastructure, nhưng không liên quan đến access control cho backup process. SQL backup cần TDE (Transparent Data Encryption) riêng nếu muốn encrypt content, và block blob đã hỗ trợ server-side encryption mặc định (SSE). Không giải quyết quyền truy cập an toàn.

🛠️ Khuyến nghị thực hiện

  1. Trên Azure Portal > Storage1 > Containers > Chọn container > Generate SAS (permissions: Read/List/Write/Create/Delete; expiry phù hợp).
  2. Test backup: BACKUP DATABASE db1 TO URL = '...sas-token...' trên SQL1.
  3. Restore trên MI1: RESTORE DATABASE db1 FROM URL = '...' (Managed Instance hỗ trợ native).

Tài liệu tham khảo chính (cập nhật 2026):
📘 SQL Server Backup to URL
📘 Azure Storage SAS Best Practices
📘 Azure SQL MI Migration Guide