Saat membuat fungsi yang ditentukan pengguna di SQL Server, Anda memiliki opsi untuk mengenkripsinya.
Untuk membuat fungsi yang ditentukan pengguna dengan T-SQL, Anda menggunakan CREATE FUNCTION
sintaksis. Untuk mengenkripsinya, tambahkan WITH ENCRYPTION
argumen.
Anda juga dapat menggunakan argumen yang sama untuk mengenkripsi fungsi yang ada saat menggunakan ALTER FUNCTION
.
Saat Anda mengenkripsi fungsi yang ditentukan pengguna dengan cara ini, teks fungsi akan dikonversi ke format yang dikaburkan. Definisi fungsi tidak langsung terlihat dalam tampilan katalog mana pun. Oleh karena itu, definisi fungsi tidak dapat dilihat oleh pengguna yang tidak memiliki akses ke tabel sistem atau file database.
Contoh 1 – Fungsi Bernilai Tabel Sebaris dengan Enkripsi
Berikut ini contoh pembuatan fungsi nilai tabel yang ditentukan pengguna terenkripsi.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Bagian untuk mengenkripsinya adalah WITH ENCRYPTION
. Saya bisa saja menghapus argumen itu jika saya tidak ingin mengenkripsinya.
Setelah membuat fungsi itu, sekarang ketika saya menggunakan sys.sql_modules
tampilan katalog sistem untuk melihat definisinya, saya mendapatkan NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Hasil:
+--------------+ | definition | |--------------| | NULL | +--------------+
Dan inilah pesan kesalahan yang saya dapatkan di Azure Data Studio ketika saya mencoba membuat skrip fungsi:
No script was returned when scripting as Create on object UserDefinedFunction
Dan saya akan mendapatkan pesan serupa jika saya mencoba melihatnya di SSMS, DBeaver, atau perangkat lunak manajemen basis data GUI lainnya.
Contoh 2 – Fungsi Bernilai Tabel Multi-Pernyataan dengan Enkripsi
Berikut adalah TVF multi-pernyataan yang melakukan hal yang sama seperti fungsi sebelumnya. TVF Multi-Pernyataan memiliki sintaks yang berbeda dengan TVF sebaris. Pada TVF Multi-Pernyataan, Anda menempatkan opsi enkripsi setelah Anda menentukan variabel yang dikembalikan.
CREATE FUNCTION [dbo].[udf_CatsByName_MSTVF]( @CatName varchar(70) ) RETURNS @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) WITH ENCRYPTION AS BEGIN INSERT INTO @cats SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName; RETURN; END; GO
Contoh 3 – Fungsi Skalar dengan Enkripsi
Dan inilah contoh fungsi skalar terenkripsi:
CREATE FUNCTION dbo.discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) RETURNS DECIMAL (12,2) WITH ENCRYPTION AS BEGIN RETURN @price * (1 - @discount); END; GO
Contoh 4 – Tambahkan Enkripsi ke Fungsi yang Ada
Jika Anda ingin mengenkripsi fungsi yang ada, gunakan ALTER FUNCTION
dengan definisi yang sama. Dengan kata lain, saya dapat mengambil contoh pertama, dan mengganti CREATE
dengan ALTER
.
ALTER FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Ini jelas mengasumsikan bahwa definisi fungsi lainnya persis sama dengan fungsi yang ada.
Cara termudah untuk memastikan bahwa Anda menggunakan definisi yang sama adalah dengan menggunakan alat GUI Anda untuk membuat skrip fungsi yang ada menggunakan opsi "Skrip sebagai Alter", jika ada. Jika tidak, Anda dapat menggunakan “Script as Create”, lalu ketika definisi muncul, ubah CREATE
dengan ALTER
.
Jika Anda hanya memiliki antarmuka baris perintah, Anda dapat menanyakan sys.sql_modules
view untuk mendapatkan definisi yang ada (seperti pada contoh sebelumnya). Anda kemudian dapat menyalin definisi dan mengganti CREATE
dengan ALTER
.
Setelah selesai, Anda dapat menambahkan WITH ENCRYPTION
dan jalankan lagi.
Contoh 5 – Menambahkan Beberapa Argumen
Anda dapat menentukan beberapa argumen sebagai daftar yang dipisahkan koma. Misalnya, jika Anda ingin menggunakan enkripsi dan Anda ingin menentukan pengikatan skema, maka Anda harus menambahkan ini sebagai daftar yang dipisahkan koma.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING, ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Dengan kata lain, Anda hanya menentukan WITH
sekali – tidak perlu mengulanginya untuk setiap argumen.
Catatan Penting
Berikut adalah beberapa hal yang harus Anda ketahui tentang mengenkripsi fungsi yang ditentukan pengguna di SQL Server:
- Pengguna istimewa yang dapat mengakses tabel sistem melalui port DAC atau mengakses file database secara langsung akan tetap dapat melihat definisi fungsi (tidak terenkripsi).
- Pengguna yang dapat melampirkan debugger ke proses server dapat mengambil prosedur asli dari memori saat runtime.
- Menggunakan enkripsi mencegah fungsi dipublikasikan sebagai bagian dari replikasi SQL Server.
- Fungsi CLR tidak dapat dienkripsi.