Tujuan dari pengikatan skema fungsi yang ditentukan pengguna (UDF) adalah untuk memastikan bahwa objek dasar yang direferensikan dalam UDF tidak dapat dimodifikasi dengan cara yang akan mempengaruhi definisi fungsi.
Ini baik-baik saja, selama Anda tidak perlu membuat perubahan apa pun pada objek yang mendasarinya. Tetapi bagaimana jika Anda memang perlu melakukan perubahan?
Anda dapat menghapus pengikatan skema dari UDF, membuat perubahan pada objek dasar, lalu menerapkan kembali pengikatan skema.
Ada dua cara untuk menghapus pengikatan fungsi yang ditentukan pengguna ke objek dasarnya:
- Ubah fungsi sehingga definisinya tidak lagi menentukan pengikatan skema.
- Lepaskan fungsi (lalu buat ulang tanpa pengikatan skema jika diperlukan).
Contoh Fungsi Terikat Skema
Pertama, berikut ini contoh fungsi terikat skema:
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;
Kami tahu ini adalah fungsi terikat skema karena mengandung WITH SCHEMABINDING
dalam definisinya. Untuk menghapus pengikatan skema, yang perlu kita lakukan hanyalah menghapus bit itu.
Opsi 1 – Mengubah Fungsi
Untuk menghapus pengikatan skema dari fungsi ini dengan mengubahnya, kita dapat menggunakan kode berikut:
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;
Yang kami lakukan hanyalah mengubah CREATE
untuk ALTER
, dan hapus WITH SCHEMABINDING
.
Opsi 2 – Lepaskan Fungsi
Berikut ini contoh penghapusan fungsi, lalu membuatnya kembali tanpa pengikatan skema:
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;
Dalam hal ini, saya menggunakan sintaks DROP IF EXISTS, yang mencegah terjadinya kesalahan jika fungsi tersebut tidak ada.