Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Премахнете SCHEMABINDING от дефинирана от потребителя функция в SQL Server

Целта на обвързването на схемата на дефинирана от потребителя функция (UDF) е да се гарантира, че базовите обекти, посочени в UDF, не могат да бъдат модифицирани по начин, който би повлиял на дефиницията на функцията.

Това е добре, стига да не е необходимо да правите промени в основните обекти. Но какво ще стане, ако трябва да направите промени?

Можете да премахнете свързването на схема от UDF, да направите промените в основния обект/и, след което да приложите отново свързването на схемата.

Има два начина да премахнете обвързването на дефинирана от потребителя функция към нейните основни обекти:

  • Променете функцията, така че нейната дефиниция вече да не посочва обвързването на схемата.
  • Изхвърлете функцията (след това я създайте отново без обвързване на схема, ако е необходимо).

Пример за функция, обвързана със схема

Първо, ето пример за функция, свързана със схема:

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;

Знаем, че това е функция, свързана със схема, защото съдържа WITH SCHEMABINDING в неговата дефиниция. За да премахнем свързването на схемата, всичко, което трябва да направим, е да премахнем този бит.

Опция 1 – Промяна на функцията

За да премахнем свързването на схемата от тази функция, като я променим, можем да използваме следния код:

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;

Всичко, което направихме, беше да променим CREATE към ALTER и премахнете WITH SCHEMABINDING .

Опция 2 – Изхвърлете функцията

Ето пример за отпадане на функцията, след което повторното й създаване без обвързване на схема:

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;

В този случай използвах синтаксиса DROP IF EXISTS, който предотвратява възникването на грешка в случай, че функцията не съществува.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server SP - Предаване на параметър за IN масив списък?

  2. Как да използвате логически оператор EXISTS в SQL Server - SQL Server / TSQL урок, част 125

  3. Актуализиране на колоната за брой от данни в друга таблица

  4. Създайте изчислена колона в SQL Server с помощта на T-SQL

  5. Как да комбинирате резултатите от две заявки в един набор от данни