Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Hapus SCHEMABINDING dari Fungsi Buatan Pengguna di SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CONVERT() vs TRY_CONVERT di SQL Server:Apa Bedanya?

  2. Kembalikan Hak Istimewa Kolom dari Server Tertaut di SQL Server (Contoh T-SQL)

  3. Cara Mengaktifkan Semua CEK &Batasan Kunci Asing dalam Database di SQL Server (Contoh T-SQL)

  4. Cara Mengimpor Database SQL Server ke Access 2016

  5. SQL Server 2016:Simpan Hasil Kueri ke File CSV