dbo trong SQL Server

Giải thích chi tiết về dbo trong SQL Server

1. dbo trong SQL Server là gì?

    dbo là viết tắt của Database Owner.
    Nó là schema mặc định trong hầu hết các cơ sở dữ liệu SQL Server.
    Một schema là một tên không gian chứa các đối tượng như: bảng, hàm, thủ tục, v.v.

🧠 Theo cách đơn giản: Bạn có thể hình dung schema như “thư mục”, còn hàm hay bảng là “tập tin” bên trong.

Ví dụ bạn tạo ra 2 hàm có dbo. và user1. như sau:

dbo.fn_TinhTong  → thư mục dbo chứa hàm fn_TinhTong
user1.fn_TinhTong → thư mục user1 chứa hàm cùng tên

2. Vì sao dbo quan trọng khi tạo hàm trong SQL Server

   Khi bạn tạo một hàm (function) mà không ghi rõ schema, SQL Server sẽ mặc định gán vào dbo nếu bạn có quyền:

CREATE FUNCTION fn_TinhTong(...) RETURNS INT ...

➤ Thực chất là dbo vì nó mặc định

CREATE FUNCTION dbo.fn_TinhTong(...) RETURNS INT ...

Khi bạn gọi hàm mà KHÔNG ghi dbo.:

    SELECT fn_TinhTong(5,6)
    ➤ SQL Server sẽ đi tìm hàm này trong schema mặc định của user hiện tại, không phải tự động ở dbo.
    ➤ Nếu không tìm thấy, nó báo lỗi:
    'fn_TinhTong' is not a recognized function name.

✅ Vậy khi gọi hàm ta nên luôn luôn gõ dbo. phía trước tên hàm, vì đó là khuyến cáo của Microsoft SQL Server.

Luôn ghi rõ schema đầy đủ khi gọi hàm, ví dụ:

SELECT dbo.fn_TinhTong(5,6)

3. Làm sao biết schema mặc định của user đã tạo hàm

Bạn có thể kiểm tra bằng câu sau:

SELECT default_schema_name
FROM sys.database_principals
WHERE name = USER_NAME();

4. Làm sao biết hàm đó ở schema nào ?

SELECT SCHEMA_NAME(schema_id) AS SchemaName, name
FROM sys.objects
WHERE name = 'fn_TinhTong' AND type = 'FN';

5. Vì sao vẫn nên viết dbo. khi dùng hàm?

Nếu kết quả không phải là dbo, thì bạn bắt buộc phải viết dbo. khi gọi hàm nếu hàm nằm trong schema đó.
 

Lý do Giải thích
✅ Rõ ràng Người đọc (hoặc sau này bạn xem lại) dễ biết hàm nằm trong schema nào
✅ Tránh lỗi khi dùng user khác Nếu sau này user khác (không phải sa) gọi hàm mà không ghi dbo., có thể lỗi
✅ Hiệu năng tốt hơn SQL Server không phải tốn công tìm kiếm hàm trong các schema khác
Bài viết liên quan:

Giải thích chi tiết về dbo trong SQL Server