Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách mã hóa một hàm do người dùng xác định trong SQL Server

Khi tạo một hàm do người dùng xác định trong SQL Server, bạn có tùy chọn mã hóa nó.

Để tạo một hàm do người dùng xác định với T-SQL, bạn sử dụng CREATE FUNCTION cú pháp. Để mã hóa nó, bạn thêm WITH ENCRYPTION đối số.

Bạn cũng có thể sử dụng cùng một đối số để mã hóa một hàm hiện có khi sử dụng ALTER FUNCTION .

Khi bạn mã hóa một hàm do người dùng xác định theo cách này, văn bản của hàm sẽ được chuyển đổi sang định dạng xáo trộn. Định nghĩa của hàm không hiển thị trực tiếp trong bất kỳ chế độ xem danh mục nào. Do đó, người dùng không có quyền truy cập vào bảng hệ thống hoặc tệp cơ sở dữ liệu không thể xem định nghĩa của hàm.

Ví dụ 1 - Hàm Nội tuyến Bảng giá trị với Mã hóa

Dưới đây là một ví dụ về cách tạo một hàm có giá trị bảng do người dùng xác định được mã hóa.

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

Phần để mã hóa nó là WITH ENCRYPTION . Tôi chỉ cần xóa đối số đó nếu tôi không muốn mã hóa nó.

Sau khi tạo hàm đó, bây giờ khi tôi sử dụng sys.sql_modules xem danh mục hệ thống để xem định nghĩa của nó, tôi nhận được NULL.

SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Kết quả:

+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

Và đây là thông báo lỗi tôi nhận được trong Azure Data Studio khi tôi cố gắng tập lệnh cho hàm:

No script was returned when scripting as Create on object UserDefinedFunction

Và tôi sẽ nhận được một thông báo tương tự nếu tôi cố gắng xem nó trong SSMS, DBeaver hoặc bất kỳ phần mềm quản lý cơ sở dữ liệu GUI nào khác.

Ví dụ 2 - Chức năng có giá trị trong bảng đa câu lệnh với mã hóa

Đây là một TVF nhiều câu lệnh hoạt động giống như chức năng trước đó. Các TVF đa câu lệnh có cú pháp khác với các TVF nội tuyến. Trên TVF đa câu lệnh, bạn đặt tùy chọn mã hóa sau khi chỉ định biến trả về.

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

Ví dụ 3 - Hàm vô hướng với mã hóa

Và đây là một ví dụ về hàm vô hướng được mã hóa:

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

Ví dụ 4 - Thêm mã hóa vào một hàm hiện có

Nếu bạn muốn mã hóa một hàm hiện có, hãy sử dụng ALTER FUNCTION với cùng một định nghĩa. Nói cách khác, tôi có thể lấy ví dụ đầu tiên và thay thế CREATE với 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

Điều này rõ ràng giả định rằng phần còn lại của định nghĩa của hàm hoàn toàn giống với hàm hiện có.

Cách dễ nhất để đảm bảo rằng bạn đang sử dụng cùng một định nghĩa là sử dụng công cụ GUI của bạn để tập lệnh cho chức năng hiện có bằng cách sử dụng tùy chọn “Tập lệnh dưới dạng thay thế”, nếu nó tồn tại. Nếu không, bạn có thể sử dụng “Script as Create”, sau đó khi định nghĩa xuất hiện, hãy thay đổi CREATE với ALTER .

Nếu bạn chỉ có giao diện dòng lệnh, bạn có thể truy vấn sys.sql_modules xem để lấy định nghĩa hiện có (như trong ví dụ trước). Sau đó, bạn có thể sao chép định nghĩa và thay thế CREATE với ALTER .

Sau khi hoàn thành việc đó, bạn có thể thêm WITH ENCRYPTION và chạy lại.

Ví dụ 5 - Thêm nhiều đối số

Bạn có thể chỉ định nhiều đối số dưới dạng danh sách được phân tách bằng dấu phẩy. Ví dụ:nếu bạn muốn sử dụng mã hóa bạn muốn chỉ định ràng buộc giản đồ, thì bạn cần thêm những thứ này dưới dạng danh sách được phân tách bằng dấu phẩy.

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

Nói cách khác, bạn chỉ xác định WITH một lần - không cần lặp lại cho mỗi đối số.

Những lưu ý quan trọng

Dưới đây là một số điều bạn nên biết về việc mã hóa các hàm do người dùng xác định trong SQL Server:

  • Người dùng đặc quyền có thể truy cập các bảng hệ thống qua cổng DAC hoặc truy cập trực tiếp vào các tệp cơ sở dữ liệu sẽ vẫn có thể xem định nghĩa (không được mã hóa) của hàm.
  • Người dùng có thể đính kèm trình gỡ lỗi vào quy trình máy chủ có thể truy xuất quy trình ban đầu từ bộ nhớ trong thời gian chạy.
  • Việc sử dụng mã hóa ngăn không cho chức năng được xuất bản như một phần của quá trình sao chép SQL Server.
  • Không thể mã hóa các hàm CLR.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi loại cột có số từ varchar thành int

  2. Bảng nhiều câu lệnh Hàm có giá trị so với Hàm được định giá trong bảng nội tuyến

  3. Lấy tất cả các tên bảng của một cơ sở dữ liệu cụ thể bằng truy vấn SQL?

  4. DateTime2 so với DateTime trong SQL Server

  5. Spotlight Cloud Basic:Công cụ giám sát hiệu suất cơ sở dữ liệu miễn phí tốt nhất