2009-04-28 39 views
7

Tôi đã có thiết lập sau:Sự cố với SQL Server "EXECUTE AS"

Có một SQL Server DB với một số bảng có trình kích hoạt được đặt trên chúng (thu thập dữ liệu lịch sử). Các trình kích hoạt này là các thủ tục được lưu trữ CLR với EXECUTE AS 'HistoryUser'. Người dùng HistoryUser là một người dùng đơn giản trong cơ sở dữ liệu mà không cần đăng nhập. Nó có đủ quyền để đọc từ tất cả các bảng và ghi vào bảng lịch sử.

Khi tôi sao lưu DB và sau đó khôi phục nó vào máy khác (Máy ảo trong trường hợp này, nhưng nó không quan trọng), trình kích hoạt không hoạt động nữa. Trong thực tế, không có mạo danh cho người dùng hoạt động nữa. Thậm chí một tuyên bố đơn giản như thế này

exec ('select 3') as user='HistoryUser' 

tạo ra một lỗi:

Cannot execute as the database principal because the principal "HistoryUser" does not exist, this type of principal cannot be impersonated, or you do not have permission.

tôi read in MSDN rằng điều này có thể xảy ra nếu chủ sở hữu DB là một người sử dụng tên miền, nhưng nó không phải là. Và ngay cả khi tôi thay đổi nó cho bất cứ điều gì khác (giải pháp được đề nghị của họ) vấn đề này vẫn còn.

Nếu tôi tạo người dùng khác mà không cần đăng nhập, tôi có thể sử dụng nó để mạo danh tốt. Đó là, này chỉ hoạt động tốt:

create user TestUser without login 
go 
exec ('select 3') as user='TestUser' 

Tôi không muốn tạo tất cả những trigger, vì vậy có cách nào làm thế nào tôi có thể làm cho HistoryUser công việc hiện tại?

Bump: Xin lỗi, nhưng đây là kinda khẩn cấp ...

Trả lời

4

tài khoản người dùng gì cò thực hiện như.

Bạn sẽ cần cấp cho người dùng IMPERSONATE các đặc quyền đó cho Người dùng lịch sử tài khoản người dùng.

GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser 

Xem thêm chi tiết tại đây

http://msdn.microsoft.com/en-us/library/ms181362.aspx

+0

Nop, không giúp đỡ. –

4

vấn đề như thế này phát sinh sau khi di chuyển một cơ sở dữ liệu từ một máy khác SID thường liên quan đến ô không phù hợp, mặc dù tôi không chắc chắn nếu hoặc làm thế nào nó áp dụng cho trường hợp của bạn. Hãy thử xóa và tạo lại người dùng cơ sở dữ liệu, đảm bảo khôi phục quyền của nó đối với các bảng đó.

+0

Đó chỉ là vấn đề - người dùng này chưa bao giờ đăng nhập. SID gì? Và, như tôi đã nói trong câu hỏi trên, tôi không muốn tạo lại người dùng, bởi vì sau đó tôi phải tạo lại toàn bộ các trình kích hoạt. –

+0

Điều này làm việc cho tôi. Chúng tôi đã phải di chuyển cơ sở dữ liệu từ một máy chủ khác và chạy vào vấn đề này. – ahwm

3

Đây là "người dùng mồ côi". Nó sẽ không hoạt động. Tài liệu nêu rõ điều này. :-( Khắc phục trạng thái "người dùng mồ côi" và nó sẽ hoạt động trở lại

+2

Tài liệu nào - bạn có thể cung cấp liên kết không? Cảm ơn – doza

5

Phát hiện Người dùng mồ côi, sau đó giải quyết bằng cách liên kết với thông tin đăng nhập.

DETECT:

SỬ DỤNG <database_name>;
GO;
sp_change_users_login @ Action = ' Báo cáo ';
GO;

giải quyết:
Lệnh sau liên kết lại tài khoản đăng nhập máy chủ theo quy định của <login_name> với người sử dụng cơ sở dữ liệu theo quy định của <database_user>:

SỬ DỤNG <database_name>;
GO
sp_change_users_login @ Action = ' update_one ',
@ UserNamePattern = ' <database_user> ',
@ LOGINNAME = ' <login_name> ';
GO

https://msdn.microsoft.com/en-us/library/ms175475.aspx

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