Lược đồ ràng buộc một đối tượng chẳng hạn như hàm do người dùng xác định (UDF) được coi là phương pháp hay, vì nó ngăn chặn các thay đổi được thực hiện đối với bất kỳ đối tượng nào mà nó tham chiếu có thể vô tình phá vỡ hàm.
Bạn có thể liên kết lược đồ với một hàm do người dùng xác định tại thời điểm bạn tạo nó hoặc bạn có thể thay đổi sau này.
Thông thường, bạn có thể kiểm tra xem một UDF có bị ràng buộc với lược đồ trong SQL Server hay không bằng cách xem định nghĩa của nó. Bạn thường có thể thực hiện việc này thông qua GUI bằng cách chọn “Script as Create” hoặc tương tự.
Bạn cũng có thể làm điều đó bằng T-SQL bằng cách chọn definition
cột của sys.sql_modules
chế độ xem danh mục hệ thống.
Nhưng điều này sẽ chỉ hoạt động nếu UDF không được mã hóa.
Tuy nhiên, có một cột khác trong sys.sql_modules
xem phục vụ mục đích của chúng tôi cho dù UDF có được mã hóa hay không:is_schema_bound
Ví dụ 1 - UDF được mã hóa
Dưới đây là một ví dụ về việc tìm hiểu xem một hàm được mã hóa do người dùng xác định có tên là udf_CatsByName_ITVF
hay không lược đồ có bị ràng buộc hay không.
SELECT definition, is_schema_bound FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Kết quả:
+--------------+-------------------+ | definition | is_schema_bound | |--------------+-------------------| | NULL | 1 | +--------------+-------------------+
Trong trường hợp này, UDF bị ràng buộc lược đồ.
Cũng lưu ý rằng definition
cột trả về NULL vì hàm đã được áp dụng mã hóa.
Ví dụ 2 - UDF Không có Mã hóa
Nếu mã hóa không được áp dụng, chúng tôi có thể thấy định nghĩa đầy đủ trong cột đó và chúng tôi sẽ thấy đối số WITH SCHEMABINDING
trong định nghĩa.
Đây là truy vấn lại khi hàm không được mã hóa.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Kết quả:
+--------------+ | definition | |--------------| | CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); | +--------------+
Tôi đã xóa is_schema_bound
từ truy vấn để dễ đọc hơn.
Dù bằng cách nào, is_schema_bound
cột có thể được sử dụng cho dù UDF có được mã hóa hay không.