Trong SQL Server, thường là một ý tưởng hay nếu lược đồ liên kết các chức năng do người dùng xác định (UDF).
Lược đồ ràng buộc UDF của bạn sẽ đảm bảo rằng các bảng bên dưới không thể thay đổi theo cách có thể ảnh hưởng đến chức năng của bạn. Nếu không có liên kết lược đồ, các bảng bên dưới hoặc các đối tượng khác có thể bị sửa đổi hoặc thậm chí bị xóa. Làm điều này có thể phá vỡ chức năng.
Để tạo một UDF liên kết giản đồ, hãy sử dụng WITH SCHEMABINDING
trong mã T-SQL của bạn để tạo hàm. Điều này áp dụng cho dù hàm là một hàm vô hướng hay một hàm giá trị bảng (TVF).
Trong mọi trường hợp, tôi đã bao gồm các ví dụ về TVF nội tuyến, TVF đa câu lệnh và hàm vô hướng.
Ví dụ 1 - Hàm Inline Table-Valued
Dưới đây là một ví dụ về cách tạo TVF nội tuyến với liên kết giản đồ:
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 ); GO
Lưu ý rằng tôi đã sử dụng tên hai phần khi tham chiếu bảng trong truy vấn của mình (tôi đã sử dụng dbo.Cats
khi tham chiếu bảng, thay vì chỉ Cats
). Thực hiện điều này là một yêu cầu đối với lược đồ ràng buộc một đối tượng. Nếu bạn cố gắng liên kết lược đồ một đối tượng mà không sử dụng tên gồm hai phần, bạn sẽ gặp lỗi.
Bây giờ, lược đồ tôi đã ràng buộc hàm của mình, nếu tôi cố gắng bỏ bảng được tham chiếu trong định nghĩa của nó, tôi sẽ gặp lỗi:
DROP TABLE Cats;
Kết quả:
Msg 3729, Level 16, State 1, Line 1 Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.
Đây là những gì sẽ xảy ra nếu tôi cố gắng tạo hàm mà không sử dụng cách đặt tên gồm hai phần:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM Cats WHERE CatName = @CatName ); GO
Kết quả:
Msg 4512, Level 16, State 3, Procedure udf_CatsByName_ITVF, Line 7 Cannot schema bind table valued function 'dbo.udf_CatsByName_ITVF' because name 'Cats' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.
Ví dụ 2 - Chức năng có giá trị trong bảng đa câu lệnh
Với TVF nhiều câu lệnh, bạn đặt WITH SCHEMABINDING
sau đặc tả biến trả về.
CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70)) RETURNS @pets TABLE ( PetId varchar(20), PetName varchar(70) ) WITH SCHEMABINDING AS BEGIN INSERT INTO @pets SELECT CONCAT('Cat', ' ', CatId), CatName FROM dbo.Cats WHERE CatName = @PetName; INSERT INTO @pets SELECT CONCAT('Dog', ' ', DogId), DogName FROM dbo.Dogs WHERE DogName = @PetName; IF @@ROWCOUNT = 0 BEGIN INSERT INTO @pets VALUES ( '', 'There are no pets of that name.' ) END RETURN; END; GO
Ví dụ 3 - Hàm vô hướng
Đây là một ví dụ về hàm vô hướng:
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint WITH SCHEMABINDING AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END; GO
Ví dụ 4 - Thêm nhiều đối số
Bạn có thể chỉ định nhiều đối số dưới dạng danh sách được phân tách bằng dấu phẩy. Ví dụ:nếu bạn muốn chỉ định liên kết giản đồ và mã hóa, sau đó bạn sẽ cần thêm những thứ này dưới dạng danh sách được phân tách bằng dấu phẩy.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING, ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO