Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Usuń SCHEMABINDING z funkcji zdefiniowanej przez użytkownika w SQL Server

Celem schematu powiązania funkcji zdefiniowanej przez użytkownika (UDF) jest zapewnienie, że obiekty podstawowe, do których odwołuje się funkcja UDF, nie mogą być modyfikowane w sposób, który miałby wpływ na definicję funkcji.

Jest to w porządku, o ile nie musisz wprowadzać żadnych zmian w obiektach bazowych. Ale co, jeśli musisz wprowadzić zmiany?

Możesz usunąć powiązanie schematu z UDF, wprowadzić zmiany w podstawowych obiektach, a następnie ponownie zastosować powiązanie schematu.

Istnieją dwa sposoby na usunięcie powiązania funkcji zdefiniowanej przez użytkownika z jej obiektami podstawowymi:

  • Zmień funkcję tak, aby jej definicja nie określała już powiązania schematu.
  • Upuść funkcję (w razie potrzeby utwórz ją ponownie bez wiązania schematu).

Przykład funkcji powiązanej ze schematem

Oto przykład funkcji powiązanej ze schematem:

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;

Wiemy, że jest to funkcja powiązana ze schematem, ponieważ zawiera WITH SCHEMABINDING w swojej definicji. Aby usunąć powiązanie schematu, wszystko, co musimy zrobić, to usunąć ten bit.

Opcja 1 – Zmień funkcję

Aby usunąć powiązanie schematu z tej funkcji poprzez jego zmianę, możemy użyć następującego kodu:

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;

Zmieniliśmy tylko CREATE na ALTER i usuń WITH SCHEMABINDING .

Opcja 2 – Usuń funkcję

Oto przykład upuszczenia funkcji, a następnie ponownego jej utworzenia bez wiązania ze schematem:

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;

W tym przypadku użyłem składni DROP IF EXISTS, która zapobiega wystąpieniu błędu w przypadku, gdy funkcja nie istnieje.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przyznaj uprawnienia na poziomie tabeli w SQL Server

  2. Wysoka dostępność programu SQL Server:Zainstaluj wystąpienie klastra trybu failover programu SQL Server, część 2

  3. SQL Server:kolumny do wierszy

  4. Salesforce SOQL z SQL Server

  5. Zatrzaski SQL Server — inne zatrzaski, o których warto wiedzieć