我有两个数据库。一个包含数据,另一个包含存储过程。用户不应该直接读取数据,而只能通过存储过程读取数据。 在服务器和所有数据库上启用标志“跨数据库所有权链接”。
作为SA,我正在做:
use data_db
create table dbo.t(....)
insert into t values(....)
use sp_db
create procedure dbo.readt as
select * from data_db.dbo.t
grant execute on dbo.readt to user1
现在我重新连接为user1
execute sp_db.dbo.readt
我收到了一个错误:
服务器主体“user1”无法访问数据库 当前安全上下文下的“data_db”。
我做错了什么?
答案 0 :(得分:1)
您需要execute as
:
create procedure dbo.readt
with execute as owner
as
begin
select * from data_db.dbo.t;
end;
然后,存储过程具有创建它的人的权限,而不是用户调用它的权限。
答案 1 :(得分:0)
您需要检查您的用户是否已映射到您尝试登录的数据库。
答案 2 :(得分:0)
问题解决了。
我最初的愿望是普通用户根本无法“使用data_db ”,因为他们不允许直接从 data_db 读取任何数据。 显然,服务器不能像那样工作...奇怪但是没问题。
作为SA:
use data_db
grant connect to user1
用户现在可以执行' use data_db '命令,但没有别的。 CDOC终于有效了!