2010-09-28 43 views
7

Tôi có cơ sở dữ liệu trong đó tất cả quyền truy cập được kiểm soát bởi các thủ tục được lưu trữ. DBA muốn tránh cung cấp cho người dùng quyền truy cập đọc/ghi trực tiếp vào các bảng bên dưới mà tôi có thể hiểu được. Do đó tất cả việc cập nhật và lựa chọn dữ liệu được thực hiện thông qua các thủ tục lưu sẵn. Về cơ bản, ông đã tạo ra một vai trò có quyền EXECUTE cho tất cả các thủ tục được lưu trữ trong cơ sở dữ liệu và cho người dùng vai trò đó.Quyền khi sử dụng "Thực thi sp_Executesql"

Vấn đề là một trong các thủ tục được lưu động sẽ tạo một truy vấn SQl và thực hiện nó thông qua "Execute sp_Executesql". Nếu không đi sâu vào chi tiết, truy vấn được tạo động bởi vì nó thay đổi đáng kể tùy thuộc vào nhiều tham số đầu vào của người dùng. Các thủ tục được lưu trữ trong câu hỏi chỉ là một câu lệnh sql SELECT tuy nhiên tôi thấy rằng chỉ cần cho phép thủ tục lưu trữ EXECUTE cho phép là không đủ. Các bảng bên dưới được tham chiếu trong thủ tục được lưu trữ sử dụng "Execute sp_Executesql" cần được cấp quyền truy cập "datareader" hoặc thủ tục được lưu trữ khác không thành công.

Bất kỳ suy nghĩ nào về cách sửa lỗi này? Tôi thực sự muốn hạn chế quyền truy cập vào các bảng để chỉ các thủ tục được lưu trữ, nhưng tôi cần phải tìm một cách để làm việc xung quanh các thủ tục được lưu trữ sử dụng "Execute sp_Executesq" l. Cảm ơn bạn.

+0

Bạn có thể nhận avdice serverfault tốt hơn. Lời khuyên của tôi - Nói chuyện với dba và giải thích tình hình. Làm việc với họ để có quyền truy cập. –

Trả lời

-3

Vấn đề thực sự là sp_Executesql nằm trong cơ sở dữ liệu chính, không nhất thiết là cơ sở dữ liệu mà bạn làm việc. DBA của bạn phải cấp quyền sp_Executesql cho thủ tục gọi. Hơn bất cứ ai có quyền gọi thủ tục đó sẽ có thể chạy sp_Executesql.

+1

-1 sp_Executesql đã thực thi công khai. "Yêu cầu tư cách thành viên trong vai trò công khai." http://msdn.microsoft.com/en-us/library/ms188001.aspx Vấn đề thực sự là quyền sở hữu chuỗi bị ngắt khi bạn sử dụng sp_executesql Xem http://stackoverflow.com/questions/3815411 – gbn

+1

Nếu bạn đã làm vững chắc cơ sở dữ liệu để khóa vai trò công khai, sau đó @ MAW74656 là chính xác; ví dụ: bạn đã tạo vai trò tùy chỉnh để thay thế vai trò công khai và xóa tất cả các đặc quyền khỏi công khai. Có, điều này đi ngược lại các yêu cầu được ghi lại nhưng các hệ thống quét cứng cơ sở dữ liệu như AppDetective (thông qua SQL Server STIG) trình bày vai trò công khai và truy cập mở mặc định của nó như là một rủi ro lớn. – Draghon

+0

... bên cạnh đó, trích dẫn cùng bài viết MSDN đó, "Chạy các câu lệnh Transact-SQL được biên dịch theo thời gian có thể hiển thị các ứng dụng cho các cuộc tấn công nguy hiểm". Điều này được hiển thị nổi bật hơn câu lệnh "Yêu cầu tư cách thành viên trong vai trò công khai". – Draghon

12

Trong proc wrapper bạn có thể sử dụng EXECUTE AS OWNER hoặc EXECUTE AS SomeuserWithNoLogin

này sẽ thay đổi bối cảnh đăng nhập trong suốt thời gian của proc được lưu trữ trong đó bao gồm sp_executesql.

  • Nếu bạn sử dụng CHỦ SỞ HỮU, nó sẽ hoạt động vì bạn đã sử dụng chuỗi quyền sở hữu.
  • Nếu DBA của bạn (người tốt!) Không muốn bạn chạy dưới dạng dbo, hãy thiết lập người dùng đã đọc đầy đủ nhưng không có quyền. EXECUTE AS <user> đòi hỏi một mục là sys.database_principals

Như thế này:

CREATE USER SomeuserWithNoLogin WITH WITHOUT LOGIN 
EXEC sp_addrolemember 'db_datareader', 'SomeuserWithNoLogin' 

Mọi chi tiết, thấy EXECUTE AS Clause on MSDNCREATE PROCEDURE

Các vấn đề liên quan