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

Cara Mengenkripsi Prosedur Tersimpan di SQL Server

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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Setup Database Mail di SQL Server (SSMS)

  2. T-SQL Lewati Ambil Prosedur Tersimpan

  3. Cara membagi string setelah karakter tertentu di SQL Server dan memperbarui nilai ini ke kolom tertentu

  4. Kinerja INNER JOIN vs LEFT JOIN di SQL Server

  5. Perbedaan antara Subquery dan Subquery Berkorelasi