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

Cách mã hóa một thủ tục được lưu trữ trong SQL Server

Trong SQL Server, bạn có thể mã hóa một thủ tục được lưu trữ tại thời điểm bạn tạo nó hoặc bạn có thể thay đổi nó sau này để bao gồm mã hóa.

Để tạo một thủ tục được lưu trữ với T-SQL, bạn sử dụng CREATE PROCEDURE 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 quy trình hiện có khi sử dụng ALTER PROCEDURE .

Khi bạn mã hóa một thủ tục được lưu trữ theo cách này, văn bản của thủ tục sẽ được chuyển đổi thành một định dạng xáo trộn. Định nghĩa của nó 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 thủ tục.

Ví dụ 1 - Tạo một thủ tục lưu trữ được mã hóa

Dưới đây là một ví dụ về cách tạo quy trình được lưu trữ được mã hóa.

CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
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ó.

Ví dụ 2 - Xem kết quả

Sau khi tạo quy trình đó, bây giờ khi tôi sử dụng sp_helptext thủ tục được lưu trữ để xem định nghĩa của thủ tục Tôi nhận được thông báo cho biết rằng nó đã được mã hóa.

EXEC sp_helptext 'usp_GetCatsByName';

Kết quả:

The text for object 'usp_GetCatsByName' is encrypted.

Và nếu tôi sử dụng sys.sql_modules chế độ xem danh mục hệ thống Tôi nhận được NULL.

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

Kết quả:

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

Tôi nhận được một kết quả tương tự, bất kể phương pháp T-SQL nào tôi sử dụng để cố gắng lấy định nghĩa của thủ tục.

Và đây là thông báo lỗi tôi nhận được trong Azure Data Studio khi tôi cố gắng viết quy trình:

No script was returned when scripting as Create on object StoredProcedure

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ụ 3 - Thêm mã hóa vào một thủ tục được lưu trữ hiện tại

Nếu bạn muốn mã hóa một quy trình đã lưu trữ hiện có, hãy sử dụng ALTER PROCEDURE 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 PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
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 quy trình hoàn toàn giống với định nghĩa 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ạo kịch bản cho quy trình 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ụ 4 - Xóa mã hóa khỏi thủ tục đã lưu trữ

Chúng tôi có thể xóa mã hóa bằng cách chạy ALTER PROCEDURE tuyên bố mà không có tùy chọn mã hóa.

ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

Lưu ý rằng điều này không giống như giải mã quy trình đã lưu trữ. Ở đây, chúng tôi chỉ đơn giản là thay đổi quy trình hiện có thành định nghĩa mới. Vì vậy, nó giả định rằng bạn đã có một bản sao của quy trình hiện có ở đâu đó trong kiểm soát nguồn của bạn.

Ví dụ 5 - Thủ tục được lưu trữ được biên dịch theo định hướng

Mã hóa không được hỗ trợ trên các quy trình được lưu trữ được biên dịch nguyên bản.

Dưới đây là những gì sẽ xảy ra khi tôi cố gắng mã hóa một quy trình được lưu trữ được biên dịch nguyên bản:

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;

Kết quả:

Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3
The option 'ENCRYPTION' is not supported with natively compiled modules.

Quy trình ví dụ đó được lấy từ bài viết của tôi, Cách tạo thủ tục lưu trữ liên kết lược đồ trong SQL Server, cũng giải thích rằng bạn cũng không thể ràng buộc lược đồ với thủ tục được lưu trữ nếu nó không phải là thủ tục được biên dịch nguyên bản.

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 thủ tục được lưu trữ 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 quy trình được lưu trữ (không mã hóa).
  • 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 quy trình được xuất bản như một phần của quá trình sao chép SQL Server.
  • Các thủ tục CLR không thể được mã hóa.
  • Không thể mã hóa các quy trình được biên dịch nguyên bản.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo Cơ sở dữ liệu SQL Server với SQLOPS

  2. Cài đặt và cấu hình SQL Server Log Shipping &Disaster Recovery -1

  3. Tự động chống phân mảnh chỉ mục trong cơ sở dữ liệu MS SQL Server

  4. Cách khắc phục “Thủ tục yêu cầu tham số‘ @statement ’thuộc loại‘ ntext / nchar / nvarchar ’.” Lỗi trong máy chủ SQL

  5. Làm cách nào để tạo một ràng buộc duy nhất cũng cho phép null?