bảng cắt ngắn Đặt quyền cho các đối tượng như các thủ tục được lưu trữ có thể được thực hiện bằng:
GRANT EXECUTE ON <schema>.<object> to <user>;
Tuy nhiên, bạn cũng có thể muốn cấp quyền bảo mật ở cả cấp độ đăng nhập và người dùng. Bạn sẽ muốn xác định và cấp CHỈ các quyền cần thiết cho các đối tượng yêu cầu quyền truy cập (chẳng hạn như thực thi). Xem xét việc sử dụng EXECUTE AS
khả năng cho phép mạo danh người dùng khác để xác thực các quyền được yêu cầu để thực thi mã mà KHÔNG phải cấp tất cả các quyền cần thiết cho tất cả các đối tượng cơ bản (ví dụ: bảng). EXECUTE AS
có thể được thêm vào các thủ tục lưu trữ, chức năng, kích hoạt, vv
Thêm vào mã như sau ngay trong Quy trình được lưu trữ:
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
Trong trường hợp này, bạn đang mạo danh chủ sở hữu của mô-đun được gọi. Bạn cũng có thể mạo danh TỰ, HOẶC người dùng tạo hoặc thay đổi mô-đun HOẶC ... không hoàn hảo CALLER, sẽ cho phép mô-đun nhận quyền của người dùng hiện tại, HOẶC ... mạo danh OWNER, sẽ có sự cho phép của chủ sở hữu của thủ tục được gọi HOẶC ... mạo danh 'user_name', sẽ mạo danh một người dùng cụ thể HOẶC ... mạo danh 'login_name' với sẽ mạo danh một thông tin đăng nhập cụ thể.
MOST của thời gian, bạn sẽ chỉ cần cấp EXECUTE
quyền cho các procs được lưu trữ và sau đó quyền được cấp cho tất cả các đối tượng được tham chiếu trong các Proc được lưu trữ.
Theo cách này, bạn KHÔNG cần phải cung cấp các quyền ngầm định (ví dụ: để cập nhật dữ liệu hoặc gọi các procs bổ sung). Quyền sở hữu chuỗi xử lý này cho bạn. Điều này đặc biệt hữu ích cho sql động hoặc nếu bạn cần tạo các tác vụ bảo mật nâng cao như CREATE TABLE
. EXECUTE AS
là một công cụ hữu ích để xem xét cho những điều này.
Ví dụ này có thể giúp làm rõ tất cả những điều này:
Tạo người dùng có tên NoPrivUser với quyền truy cập công khai vào cơ sở dữ liệu (ví dụ: dbadb):
USE [master];
GO
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb],
CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO
USE [DBAdb];
GO
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO
LƯU Ý: TẠO HOẶC CHỦ SỞ HỮU THỦ TỤC NÀY SILL YÊU CẦU TẠO QUYỀN BẢNG trong cơ sở dữ liệu đích.
use DBAdb
go
CREATE PROCEDURE dbo.MyProcedure
WITH EXECUTE AS OWNER
truncate table MyTable
GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser;
GO
-- Now log into your database server as NoPrivUser and run the following.
Với EXECUTE AS
mệnh đề, thủ tục được lưu trữ được chạy trong ngữ cảnh của chủ sở hữu đối tượng. Mã này tạo thành công dbo.MyTable
và hàng được chèn thành công. Trong ví dụ này, người dùng NoPrivUser
hoàn toàn không có quyền được cấp để sửa đổi bảng hoặc đọc hoặc sửa đổi bất kỳ dữ liệu nào trong bảng này.
Nó chỉ đảm nhận các quyền cần thiết để hoàn thành nhiệm vụ cụ thể này được mã hóa trong bối cảnh của thủ tục này.
Phương pháp tạo các thủ tục được lưu trữ này có thể thực hiện các tác vụ yêu cầu quyền bảo mật nâng cao mà không gán vĩnh viễn các quyền đó sẽ rất hữu ích.