sql >> Base de Datos >  >> RDS >> Sqlserver

Eliminar SCHEMABINDING de una función definida por el usuario en SQL Server

El propósito de vincular el esquema a una función definida por el usuario (UDF) es garantizar que los objetos base a los que se hace referencia en la UDF no se puedan modificar de una manera que afecte la definición de la función.

Esto está bien, siempre que no necesite realizar ningún cambio en los objetos subyacentes. Pero, ¿y si necesita hacer cambios?

Puede eliminar el enlace de esquema de una UDF, realizar los cambios en los objetos base y luego volver a aplicar el enlace de esquema.

Hay dos formas de eliminar el enlace de una función definida por el usuario a sus objetos base:

  • Modifique la función para que su definición ya no especifique el enlace de esquema.
  • Elimine la función (luego vuelva a crearla sin vinculación de esquema si es necesario).

Ejemplo de una función vinculada a un esquema

Primero, aquí hay un ejemplo de una función vinculada a un esquema:

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;

Sabemos que es una función vinculada a un esquema porque contiene WITH SCHEMABINDING en su definición. Para eliminar el enlace de esquema, todo lo que tenemos que hacer es eliminar ese bit.

Opción 1:modificar la función

Para eliminar el enlace de esquema de esta función modificándola, podemos usar el siguiente código:

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;

Todo lo que hicimos fue cambiar CREATE para ALTER y elimine WITH SCHEMABINDING .

Opción 2:eliminar la función

Aquí hay un ejemplo de eliminar la función y luego volver a crearla sin vinculación de esquema:

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;

En este caso, utilicé la sintaxis DROP IF EXISTS, que evita que ocurra un error en caso de que la función no exista.