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 và 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.