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
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)
Bạn có thể kiểm tra bằng câu sau:
SELECT default_schema_name
FROM sys.database_principals
WHERE name = USER_NAME();
SELECT SCHEMA_NAME(schema_id) AS SchemaName, name
FROM sys.objects
WHERE name = 'fn_TinhTong' AND type = 'FN';
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 |
Giải thích chi tiết về dbo trong SQL Server