EXECUTE GRANT cho tất cả các thủ tục được lưu trữ


147

Lệnh sau có cho phép người dùng "MyUser" một cách hiệu quả để thực thi TẤT CẢ các thủ tục được lưu trữ trong cơ sở dữ liệu không?

GRANT EXECUTE TO [MyDomain\MyUser]

Câu trả lời:


244

SQL Server 2008 trở lên:

/* CREATE A NEW ROLE */
CREATE ROLE db_executor

/* GRANT EXECUTE TO THE ROLE */
GRANT EXECUTE TO db_executor

Chỉ dành cho người dùng (không phải vai trò):

USE [DBName]
GO
GRANT EXECUTE TO [user]

28
+1 cộng: nó thậm chí còn cấp quyền EXECUTE cho các quy trình được lưu trữ trong tương lai, ví dụ: các quy trình chưa có trong cơ sở dữ liệu của bạn - nhưng sẽ được tạo sau này.
marc_s

2
Tôi nghĩ rằng đáng lưu ý rằng bạn usercó thể phải nằm trong dấu ngoặc vuông. Điều này đúng trong trường hợp sử dụng của tôi ít nhất một phần vì người dùng của tôi có tên miền được đính kèm (nghĩa là nó có ký tự \ trong đó). chỉnh sửa: sửa ký tự gạch chéo không cố định
PrinceTyke

1
Tại sao không gán người dùng cho vai trò db_ddladmin? "Thành viên của vai trò cơ sở dữ liệu cố định db_ddladmin có thể chạy bất kỳ lệnh Ngôn ngữ định nghĩa dữ liệu (DDL) nào trong cơ sở dữ liệu." - xem tại đây
Michael Tobisch

1
@MichaelTobisch ở đây chỉ cần thực hiện Thủ tục lưu trữ. Vai trò DDL phải được sử dụng trong các kịch bản Tạo, Thay đổi, Thả, .... Các liên kết này phải hữu ích: docs.microsoft.com/en-us/sql/relational-database/security/ và and geekforgeek.org/sql-ddl-dml-dcl-tcl-commands
QMaster

2
Và cấp độ tiếp theo của việc thêm người dùng vào vai trò trong trường hợp nó tiết kiệm cho ai đó một bước nghiên cứu khác. THAY THẾ VAI TRÒ db_executor THÊM THÀNH VIÊN
YourUserNameHere

72

SQL Server 2005 đã giới thiệu khả năng cấp quyền thực thi cơ sở dữ liệu cho nguyên tắc cơ sở dữ liệu, như bạn đã mô tả:

GRANT EXECUTE TO [MyDomain\MyUser]

Điều đó sẽ cấp quyền ở phạm vi cơ sở dữ liệu, bao gồm tất cả các thủ tục được lưu trữ trong tất cả các lược đồ. Điều này có nghĩa là bạn không phải cấp quyền rõ ràng cho mỗi thủ tục được lưu trữ.

Bạn cũng có thể hạn chế bằng cách cấp quyền thực thi lược đồ nếu bạn muốn chi tiết hơn:

GRANT EXECUTE ON SCHEMA ::dbo TO [MyDomain\MyUser]

5
Thật tuyệt khi có thể làm điều này với một lược đồ cụ thể, vì vậy hãy tránh các quyền trên sys
RemarkLima 13/03/2016

17

Ngoài các câu trả lời ở trên, tôi muốn thêm:


Thay vào đó, bạn có thể muốn cấp vai trò này và sau đó gán vai trò cho (các) người dùng. Giả sử bạn đã tạo một vai trò myAppRightsthông qua

CREATE ROLE [myAppRights] 

sau đó bạn có thể đưa ra quyền thực thi thông qua

GRANT EXECUTE TO [myAppRights] 

với vai trò đó.


Hoặc, nếu bạn muốn làm điều đó ở cấp lược đồ:

GRANT EXECUTE ON SCHEMA ::dbo TO [myAppRights]

cũng hoạt động (trong ví dụ này, vai trò myAppRightssẽ có quyền thực thi trên tất cả các phần tử của lược đồ dbosau đó).

Bằng cách này, bạn chỉ phải thực hiện một lần và có thể dễ dàng gán / thu hồi tất cả các quyền ứng dụng liên quan đến / từ người dùng nếu bạn cần thay đổi điều đó sau này - đặc biệt hữu ích nếu bạn muốn tạo hồ sơ truy cập phức tạp hơn.

Ghi chú: Nếu bạn cấp một vai trò cho một lược đồ, điều đó cũng ảnh hưởng đến các yếu tố bạn sẽ tạo sau này - điều này có thể có lợi hay không tùy thuộc vào thiết kế bạn dự định, vì vậy hãy ghi nhớ điều đó.


-5

THỰC HIỆN CẤP ĐẾN [VAI TRÒ]

Điều này chắc chắn sẽ giúp


Bạn không muốn cấp thực thi cho vai trò công khai, nó sẽ mở ra những lo ngại về bảo mật. Chỉ cần cấp nó cho người dùng hoặc vai trò. Cấp thực thi cho các procs cụ thể là cách tốt nhất để bạn có thể kiểm soát ai đang đánh cái gì.
ammills01

Sự mỉa mai ở đây không phù hợp với một trang web Hỏi & Đáp, đặc biệt là khi nó mang lại kết quả nguy hiểm.
Christopher Brown

"Mọi thông tin đăng nhập đều thuộc về vai trò máy chủ cố định công cộng và mọi người dùng cơ sở dữ liệu đều thuộc về vai trò cơ sở dữ liệu công cộng. Khi đăng nhập hoặc người dùng chưa được cấp hoặc từ chối các quyền cụ thể trên bảo mật, thông tin đăng nhập hoặc người dùng sẽ thừa hưởng các quyền được cấp cho công chúng trên có thể bảo mật "Vì vậy, cấp bất kỳ quyền nào cho PUBLIC có nghĩa là cấp các quyền đó cho tất cả người dùng. Đây là một lỗ hổng lớn. Đọc liên kết này để biết thêm: docs.microsoft.com/en-us/sql/relational-database/security/ Kẻ
QMaster

Với câu trả lời như thế này, không có gì lạ khi có rất nhiều trang web và cơ sở dữ liệu được bảo mật kém ngoài kia. Trời ạ.
Dave Lucre
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.