MS SQL 2014跨数据库访问不能像我期望的那样工作

时间:2017-01-31 18:46:27

标签: sql-server sql-server-2014

我有两个数据库。一个包含数据,另一个包含存储过程。用户不应该直接读取数据,而只能通过存储过程读取数据。 在服务器和所有数据库上启用标志“跨数据库所有权链接”。

作为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”。

我做错了什么?

3 个答案:

答案 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终于有效了!