Theo hiểu biết của tôi, tôi có thể sử dụng EXECUTE AS OWNERmệnh đề như một phần của thủ tục mà tôi tạo để làm cho phần thân của thủ tục đó chạy như một người dùng khác. Mục tiêu của tôi là thực thi một lệnh yêu cầu sysadminvai trò ( DBCC TRACEON(1224)). Thủ tục này được cho là được gọi bởi một người dùng không có đặc quyền.
Tôi đã chạy đoạn script sau dưới sangười dùng:
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin')
-- dbo 1 1
IF EXISTS(SELECT * FROM sys.procedures WHERE name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
WITH EXECUTE AS OWNER
AS
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin');
-- dbo 1 0
DBCC TRACEON(1224)
--Msg 2571, Level 14, State 3, Procedure MyProc, Line 7
--User 'dbo' does not have permission to run DBCC TRACEON.
RETURN
GO
EXEC MyProc
Đầu ra là nội tuyến trong ý kiến. Hóa ra bên ngoài thủ tục tôi dường như có sysadmintư cách thành viên, nhưng không phải bên trong thủ tục.
Thủ tục thuộc sở hữu của dbongười dùng. Tôi hiểu rằng không thể cấp sysadminvai trò cho người dùng cơ sở dữ liệu (ít nhất GUI không cung cấp khả năng này). Vì vậy, tôi không thấy làm thế nào tôi có thể làm cho người dùng cơ sở dữ liệu có vai trò máy chủ.
Tôi cũng đã thử EXECUTE AS 'sa'kết quả trong Cannot execute as the user 'sa', because it does not exist or you do not have permission.. Các tài liệu nói rằng tôi chỉ có thể chỉ định một tên người dùng, không phải là một tên đăng nhập. Vì vậy, tôi hiểu tại sao điều đó không làm việc.
Làm thế nào tôi có thể chạy thủ tục của tôi với sysadminvai trò thành viên?