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.