Mục đích của lược đồ ràng buộc một hàm do người dùng xác định (UDF) là để đảm bảo rằng các đối tượng cơ sở được tham chiếu trong UDF không thể được sửa đổi theo cách có thể ảnh hưởng đến định nghĩa của hàm.
Điều này không sao cả, miễn là bạn không cần thực hiện bất kỳ thay đổi nào đối với các đối tượng cơ bản. Nhưng nếu bạn cần thay đổi thì sao?
Bạn có thể xóa liên kết lược đồ khỏi UDF, thực hiện các thay đổi đối với / s đối tượng cơ sở, sau đó áp dụng lại liên kết lược đồ.
Có hai cách để loại bỏ ràng buộc của một hàm do người dùng xác định với các đối tượng cơ sở của nó:
- Thay đổi hàm để định nghĩa của nó không còn chỉ định liên kết lược đồ nữa.
- Bỏ chức năng (sau đó tạo lại nó mà không cần liên kết giản đồ nếu cần).
Ví dụ về hàm liên kết giản đồ
Đầu tiên, đây là một ví dụ về hàm liên kết lược đồ:
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;
Chúng tôi biết đó là một hàm liên kết giản đồ vì nó chứa WITH SCHEMABINDING
trong định nghĩa của nó. Để xóa liên kết lược đồ, tất cả những gì chúng ta cần làm là xóa bit đó.
Tùy chọn 1 - Thay đổi chức năng
Để xóa liên kết lược đồ khỏi hàm này bằng cách thay đổi nó, chúng ta có thể sử dụng đoạn mã sau:
ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Tất cả những gì chúng tôi đã làm là thay đổi CREATE
thành ALTER
và xóa WITH SCHEMABINDING
.
Tùy chọn 2 - Bỏ chức năng
Dưới đây là một ví dụ về việc loại bỏ chức năng, sau đó tạo lại nó mà không có liên kết giản đồ:
DROP FUNCTION IF EXISTS dbo.ufn_CountAlbums; GO CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Trong trường hợp này, tôi đã sử dụng cú pháp DROP IF EXISTS, cú pháp này ngăn lỗi xảy ra trong trường hợp hàm không tồn tại.