Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Xóa SCHEMABINDING khỏi một hàm do người dùng xác định trong SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. String_agg cho SQL Server trước năm 2017

  2. Làm cách nào để tôi chèn một Byte [] vào một cột VARBINARY của Máy chủ SQL

  3. Làm cách nào để tôi nhóm theo cột ngày giờ mà không mất thời gian cân nhắc

  4. Lỗi máy chủ SQL:Dữ liệu chuỗi hoặc nhị phân sẽ bị cắt bớt

  5. Định dạng ngày / giờ tùy chỉnh trong SQL Server