Làm thế nào để bạn cấp quyền thực thi cho một thủ tục được lưu trữ?


40

Thông thường khi tôi tạo một thủ tục được lưu trữ, tôi sử dụng như sau một mẫu sắp xếp

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

Có cách nào để bao gồm việc cấp quyền thực thi chỉ cho thủ tục được lưu trữ đó trong khi tôi đang ở đó không?
Ví dụ như ...

Grant execute [User_Execute] 

... nhưng chỉ cho thủ tục được lưu trữ này?

Tôi đã thấy một số câu hỏi tương tự khác nhưng dường như tất cả chúng đều đề cập đến TẤT CẢ các thủ tục được lưu trữ và không chỉ một, tôi cũng không thấy một câu hỏi mà bạn có thể chỉ định các quyền bên trong create proceduretập lệnh. Ngay cả câu trả lời về cách tôi có thể đặt quyền mà không cần GUI cho các quy trình được lưu trữ cụ thể cũng sẽ được hoan nghênh.

Chỉnh sửa Câu trả lời hàng đầu chắc chắn đã chỉ cho tôi đi đúng hướng, đây thực chất là những gì tôi đang tìm kiếm, tôi đã không nghĩ về việc sắp xếp các lệnh mà cuối cùng tôi đã làm, xử lý lệnh cùng với thủ tục được lưu trữ của tôi. Dù sao, tôi nghĩ rằng nó khá trơn tru.

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO

Mã được cung cấp trong văn bản chỉnh sửa là hợp lệ và câu trả lời chính xác cho câu hỏi này.
ninty9notout

Câu trả lời:



10

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 ASkhả 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 AScó 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 EXECUTEquyề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 ASlà 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 ASmệ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.MyTablevà hàng được chèn thành công. Trong ví dụ này, người dùng NoPrivUserhoà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.


4
Đây là cùng một câu trả lời bạn đã đăng trên SO ngày hôm qua , mà tôi cũng phải định dạng cho dễ đọc.
Aaron Bertrand

5

nhập mô tả hình ảnh ở đây

chọn đăng nhập cơ sở dữ liệu -> Chuyển đến Bảo mật và nhấp vào nút Tìm kiếm như trong hình ảnh trước. Khi nhấp vào nút Tìm kiếm, bạn sẽ thấy anh ta theo dõi cửa sổ để thêm loại đối tượng.

Nhấp vào nút Loại đối tượng và bạn sẽ nhận được Loại Chọn đối tượng Cửa sổ trực tuyến với nhiều đối tượng khác nhau. Bây giờ nếu bạn thấy, thủ tục lưu trữ được liệt kê trong khu vực loại đối tượng. Bây giờ chúng tôi sẽ chọn thủ tục lưu trữ cụ thể mà chúng tôi muốn cung cấp cho phép.


Đầu tiên, câu hỏi đã hơn năm tuổi khi bạn trả lời nó. Điều đó sẽ ổn, ngoại trừ OP yêu cầu cụ thể các giải pháp không sử dụng GUI và có thể được nhúng trong tập lệnh. Phản hồi của bạn không giải quyết điều đó.
Eric Brandt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.