2012-10-31 40 views
7

Tôi đang sử dụng SQL Server 2008 R2. Tôi cần phải liệt kê ra tất cả các thủ tục được lưu trữ mà người dùng cơ sở dữ liệu (MYUSER) đã thực thi quyền.Tìm các thủ tục lưu sẵn có quyền thực thi

Ngoài ra, tôi cần phải ra khỏi danh sách đó là những thủ tục được lưu trữ mà người dùng không có quyền thực thi - nhưng có thể đọc kịch bản của thủ tục lưu trữ

Có bất kỳ câu lệnh SQL hoặc chức năng helper cho các mục đích?

THAM KHẢO:

  1. Granting execute permission on all stored procedures in a certain database

Trả lời

10

Sử dụng HAS_PERMS_BY_NAME:

select name, 
    has_perms_by_name(name, 'OBJECT', 'EXECUTE') as has_execute, 
    has_perms_by_name(name, 'OBJECT', 'VIEW DEFINITION') as has_view_definition 
from sys.procedures 
+0

tôi có thể xem các tập lệnh của proc lưu trữ edure sử dụng "Script Stored Procedure As" -> "Tạo thành"; nhưng has_view_definition là đến "0". Làm thế nào chúng ta có thể sửa nó? – Lijo

+1

Bạn có thể chạy ['SELECT * FROM sys.fn_my_permissions ('', 'OBJECT')'] (http://msdn.microsoft.com/en-us/library/ms176097.aspx) và đăng ở đây kết quả không? –

+1

BTW, truy vấn của tôi không xử lý các thủ tục trong lược đồ khác, không phải dbo. Bạn có thể dễ dàng tự sửa lỗi đó. –

5

HAS_PERMS_BY_NAME, như được sử dụng trong bối cảnh của kịch bản được cung cấp trong câu trả lời đầu tiên, sẽ cung cấp các kết quả mong muốn chỉ khi bạn được kết nối với tư cách là "MYUSER" vì chức năng này

"Ước lượng các phép hiệu quả của người sử dụng hiện tại"

5

Để kiểm tra sự cho phép cho một người dùng khác nhau, sử dụng này:

use my_db; 
EXECUTE AS user = 'my_user' 
SELECT SUSER_NAME(), USER_NAME(); 
select name, 
    has_perms_by_name(name, 'OBJECT', 'EXECUTE') as has_execute 

from sys.procedures 
where name = 'myprocname'; 
revert; 

trình cho SQL Server của tôi năm 2012.

4

Câu trả lời từ knb không phù hợp với tôi vì thiếu quyền. (Một giải pháp cho một người sử dụng khác so với hiện tại một)

Không thể thực hiện như hiệu trưởng cơ sở dữ liệu vì hiệu trưởng "người sử dụng tôi" không tồn tại, loại này chủ yếu không thể mạo nhận, hoặc bạn không có sự cho phép.

này answer cho thấy làm thế nào để có được danh sách các thủ tục được lưu trữ trên đó một người dùng cơ sở dữ liệu cụ thể ('người dùng của tôi') có EXECUTE phép cấp một cách rõ ràng:

SELECT [name] 
FROM sys.objects obj 
INNER JOIN sys.database_permissions dp ON dp.major_id = obj.object_id 
WHERE obj.[type] = 'P' -- stored procedure 
AND dp.permission_name = 'EXECUTE' 
AND dp.state IN ('G', 'W') -- GRANT or GRANT WITH GRANT 
AND dp.grantee_principal_id = 
    (SELECT principal_id 
    FROM sys.database_principals 
    WHERE [name] = 'my user') 

tôi sửa đổi nó như sau để có được danh sách tôi cần:

SELECT [name] 
FROM sys.procedures 
WHERE [name] NOT IN 
    (SELECT [name] 
    FROM sys.objects obj 
    INNER JOIN sys.database_permissions dp ON dp.major_id = obj.object_id 
    WHERE obj.[type] = 'P' -- stored procedure 
    AND dp.permission_name = 'EXECUTE' 
    AND dp.state IN ('G', 'W') -- GRANT or GRANT WITH GRANT 
    AND dp.grantee_principal_id = 
     (SELECT principal_id 
     FROM sys.database_principals 
     WHERE [name] = 'my user')) 

Thử nghiệm trên Microsoft SQL server 2008 R2

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