Làm thế nào để cho phép thực hiện các thủ tục được lưu trữ nhưng không ghi?


11

Tôi muốn thiết lập người dùng "đọc" trên phiên bản SQL Server 2012 của mình. Tôi muốn cho phép anh ta thực hiện bất kỳ thủ tục được lưu trữ, hoặc hàm hoặc câu lệnh SQL trực tiếp nào, lấy dữ liệu từ tất cả các bảng và dạng xem, nhưng không cập nhật hoặc chèn (tức là đọc bất cứ thứ gì và không viết gì).

Tôi có thể thiết lập điều này mà không cung cấp quyền cụ thể cho từng chức năng hoặc thủ tục được lưu trữ theo tên, mà chỉ cấp cho anh ta quyền thực thi trên bất kỳ chức năng hoặc thủ tục được lưu trữ nào, chỉ mất quyền sửa đổi bảng?

Thay vào đó, mọi thứ sẽ thay đổi nếu tôi chạy SQL Server 2008 chứ?

Làm rõ và bổ sung:

  1. Nếu một thủ tục được lưu trữ thay đổi dữ liệu, người dùng sẽ nhận được thông báo lỗi (từ chối sửa đổi hoặc từ chối truy cập hoàn toàn vào thủ tục được lưu trữ).
  2. Nếu một giải pháp tiềm năng liên quan đến việc từ chối quyền, tôi có thể không cấp một số quyền nhất định thay vì từ chối không?
  3. Từ chối có thể được áp dụng trên tất cả các bảng, dạng xem, v.v. (hiện tại và trong tương lai) trong cơ sở dữ liệu trong một tuyên bố không?

Tôi là người mới ở đây, xin vui lòng đặt thẻ phù hợp và nếu không để chỉnh sửa câu hỏi
gt6989b

1
@KrisGruttemeyer đó là suy nghĩ - anh ta có thể thực thi nó nhưng nó sẽ dẫn đến một lỗi nào đó; Ngoài ra, tôi vẫn ổn khi anh ta không được phép thực hiện nó, miễn là tôi không phải chỉ định danh sách các sp mà anh ta có đặc quyền để chạy
gt6989b

1
Trong trường hợp đó, bạn cần đọc về quyền của SQL Server. Có 3 biến thể quyền - GRANTđể cấp quyền, DENYtừ chối quyền và REVOKExóa một GRANThoặc DENY. Nếu không có GRANThoặc DENYngười dùng có thể kế thừa quyền, hãy nói từ việc truy cập vào một thủ tục được lưu trữ.
JNK

1
@ gt6989b Nếu bạn DENY DELETE, INSERT, UPDATEtrên cơ sở dữ liệu hoặc lược đồ tôi tin rằng nó sẽ chỉ ảnh hưởng đến các bảng và dạng xem.
JNK

1
@ gt6989b - Chỉ cần lưu ý rằng câu trả lời được đề xuất trong các nhận xét này hóa ra là không chính xác. Xem phản ứng của Paul White.
RLF

Câu trả lời:


15

Điều này không dễ đạt được như bạn nghĩ. Một cách là tạo vai trò cơ sở dữ liệu do người dùng xác định mới, cung cấp tất cả các quyền cần thiết cho vai trò đó, sau đó thêm người dùng vào vai trò mới. Điều này ít nhất giúp cho người dùng (hoặc các vai trò do người dùng khác xác định) dễ dàng hơn trong nhóm quyền này trong tương lai. Các bước sau đây là một khởi đầu tốt:

-- The user-defined role containing all required permissions
CREATE ROLE Readers AUTHORIZATION dbo;

-- Give read-only access to all tables,
-- views on those tables, and in-line
-- functions
ALTER ROLE db_datareader ADD MEMBER Readers;

-- Example: add a user (Bob) to the role
ALTER ROLE Readers ADD MEMBER Bob;

Sau này, Bob sẽ có các đặc quyền chỉ đọc rộng rãi trong cơ sở dữ liệu. Anh ta sẽ có thể đọc từ tất cả các bảng, các khung nhìn trên các bảng đó và các hàm nội tuyến. Anh ta sẽ không thể thực hiện bất kỳ thủ tục hoặc sử dụng các chức năng phi nội tuyến, tuy nhiên.

Bạn sẽ cần cấp các quyền cụ thể cho vai trò Người đọc cho các chức năng và quy trình an toàn mà bạn muốn Người đọc có quyền truy cập. Có thể có các bước bạn có thể thực hiện để làm cho quá trình này dễ dàng hơn (chẳng hạn như nhóm các đối tượng vào một lược đồ và cấp quyền thực thi trên lược đồ thay vì các đối tượng riêng lẻ) nhưng có quá nhiều chi tiết để trình bày ở đây.

Một điều cần lưu ý là việc thiếu các đặc quyền sửa đổi dữ liệu sẽ không ngăn được Reader đọc thay đổi dữ liệu thông qua thủ tục được lưu trữ mà cô ấy đã được cấp quyền thực thi, nếu thủ tục và đối tượng được sửa đổi chia sẻ một chủ sở hữu chung. Cũng không thể từ chối rõ ràng trong trường hợp này. Tính năng này được gọi là Chuỗi sở hữu .

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.