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

Cara Mengenkripsi Fungsi Buatan Pengguna di SQL Server

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.

  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 Membuat Tabel di SQL Server menggunakan Query

  2. Panggil prosedur tersimpan dengan parameter bernilai tabel dari Java

  3. Tugas SSIS untuk impor jumlah kolom yang tidak konsisten?

  4. SMALLDATETIMEFROMPARTS() Contoh di SQL Server (T-SQL)

  5. Bagaimana cara mengirim email dari SQL Server?