Di SQL Server, Anda dapat mengenkripsi prosedur tersimpan pada saat Anda membuatnya, atau Anda dapat mengubahnya nanti untuk menyertakan enkripsi.
Untuk membuat prosedur tersimpan dengan T-SQL, Anda menggunakan CREATE PROCEDURE
sintaksis. Untuk mengenkripsinya, tambahkan WITH ENCRYPTION
argumen.
Anda juga dapat menggunakan argumen yang sama untuk mengenkripsi prosedur yang ada saat menggunakan ALTER PROCEDURE
.
Saat Anda mengenkripsi prosedur tersimpan dengan cara ini, teks prosedur dikonversi ke format yang dikaburkan. Definisinya tidak langsung terlihat dalam tampilan katalog mana pun. Oleh karena itu, definisi prosedur tidak dapat dilihat oleh pengguna yang tidak memiliki akses ke tabel sistem atau file database.
Contoh 1 – Membuat Prosedur Tersimpan Terenkripsi
Berikut ini contoh pembuatan prosedur tersimpan terenkripsi.
CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS 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.
Contoh 2 – Lihat Hasilnya
Setelah membuat prosedur itu, sekarang ketika saya menggunakan sp_helptext
prosedur tersimpan untuk melihat definisi prosedur Saya mendapat pesan yang memberi tahu saya bahwa itu dienkripsi.
EXEC sp_helptext 'usp_GetCatsByName';
Hasil:
The text for object 'usp_GetCatsByName' is encrypted.
Dan jika saya menggunakan sys.sql_modules
tampilan katalog sistem saya mendapatkan NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');
Hasil:
+--------------+ | definition | |--------------| | NULL | +--------------+
Saya mendapatkan hasil yang serupa, terlepas dari metode T-SQL mana yang saya gunakan untuk mencoba mendapatkan definisi prosedur.
Dan inilah pesan kesalahan yang saya dapatkan di Azure Data Studio ketika saya mencoba membuat skrip prosedur:
No script was returned when scripting as Create on object StoredProcedure
Dan saya akan mendapatkan pesan serupa jika saya mencoba melihatnya di SSMS, DBeaver, atau perangkat lunak manajemen basis data GUI lainnya.
Contoh 3 – Tambahkan Enkripsi ke Prosedur Tersimpan yang Ada
Jika Anda ingin mengenkripsi prosedur tersimpan yang ada, gunakan ALTER PROCEDURE
dengan definisi yang sama. Dengan kata lain, saya dapat mengambil contoh pertama, dan mengganti CREATE
dengan ALTER
.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
Ini jelas mengasumsikan bahwa definisi prosedur lainnya persis sama dengan yang sudah ada.
Cara termudah untuk memastikan bahwa Anda menggunakan definisi yang sama adalah dengan menggunakan alat GUI Anda untuk membuat skrip prosedur 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 4 – Hapus Enkripsi dari Prosedur Tersimpan
Kami dapat menghapus enkripsi dengan menjalankan ALTER PROCEDURE
pernyataan tanpa opsi enkripsi.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname;
Perhatikan bahwa ini tidak sama dengan mendekripsi prosedur tersimpan. Di sini, kami hanya mengubah prosedur yang ada ke definisi baru. Jadi diasumsikan bahwa Anda sudah memiliki salinan prosedur yang ada di suatu tempat di kendali sumber Anda.
Contoh 5 – Prosedur Tersimpan Secara Asli Dikompilasi
Enkripsi tidak didukung pada prosedur tersimpan yang dikompilasi secara asli.
Inilah yang terjadi ketika saya mencoba mengenkripsi prosedur tersimpan yang dikompilasi secara asli:
ALTER PROCEDURE [dbo].[usp_GetCowsByName] @cowname varchar(70) WITH SCHEMABINDING, NATIVE_COMPILATION, ENCRYPTION AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' ) SELECT CowId, CowName, Phone FROM dbo.Cows WHERE CowName = @cowname END;
Hasil:
Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3 The option 'ENCRYPTION' is not supported with natively compiled modules.
Contoh prosedur tersebut diambil dari artikel saya, Cara Membuat Prosedur Tersimpan Terikat Skema di SQL Server, yang juga menjelaskan bahwa Anda juga tidak dapat mengikat skema prosedur tersimpan jika itu bukan prosedur yang dikompilasi secara asli.
Catatan Penting
Berikut adalah beberapa hal yang harus Anda ketahui tentang mengenkripsi prosedur tersimpan di SQL Server:
- Pengguna istimewa yang dapat mengakses tabel sistem melalui port DAC atau mengakses file database secara langsung akan tetap dapat melihat definisi prosedur tersimpan (tidak terenkripsi).
- Pengguna yang dapat melampirkan debugger ke proses server dapat mengambil prosedur asli dari memori saat runtime.
- Menggunakan enkripsi mencegah prosedur dipublikasikan sebagai bagian dari replikasi SQL Server.
- Prosedur CLR tidak dapat dienkripsi.
- Prosedur yang dikompilasi secara native tidak dapat dienkripsi.