我有两个数据库。
数据库:
1. DB1
2. DB2
我创建了两个新登录。
登录
1. DB1_login
2. DB2_login
接下来,我为映射到上述登录的每个数据库创建了用户。
create user DB1_login1_user1 for login DB1_login;
create user DB2_login2_user2 for login DB2_login;
因此,DB1数据库的DB1_login1_user1用户将被映射到DB1_login1登录,DB2数据库的DB2_login2_user2用户将被映射到DB2_login2登录。
两个用户的授权数据库角色权限为 db_datareader 和 db_datawriter 。
在 DB2 中,我有一个名为 dbo.sample_table 的表。
我的要求:
我们假设我已登录为DB1_login1。
在此登录中,我已将DB1_login1_user1用户的权限授予DB1数据库。
现在来自DB1,我必须在DB2中选择一个表 dbo.sample_table ,该表已映射到另一个登录DB2_login2。
以下是查询我要做的是。
--CURRENTLY LOGGED IN AS DB1_LOGIN1
USE DB1;
EXECUTE as login='DB2_login2'
select * from DB2.dbo.sample_table
GO
我在LOGIN :: DB2_login2上尝试了GRANT IMPERSONATE到DB1_login1,但它没有用,而且,我不知道跨登录授予权限。我认为授予权限很重要,我需要帮助。
如何成功执行上述查询?
任何帮助都会很明显。
答案 0 :(得分:1)
您创建的用户仅存在于各自的数据库中,因此您无法尝试执行此操作。即使它是,或者你允许在两个数据库中访问(创建用户登录)并给予权限并启用跨数据库访问,这将是一个太大的安全风险。
我建议使用存储过程访问数据交叉数据库。应使用证书对存储过程进行签名,并在两个数据库中创建相同的证书。我已经在各种场合实现了它并且它完美无缺。
Erland Sommarskog here有一个很好的例子。
答案 1 :(得分:0)
我确实授予了登录权限。
从管理员登录" Sa" ,我执行了以下查询。
GRANT IMPERSONATE ON LOGIN::DB2_login to DB1_login;
然后从DB1_login执行以下查询以跨登录访问数据库。
USE MASTER;
EXECUTE as login='DB2_login';
SELECT * FROM DB2.dbo.sample_table;
REVERT;
GO
最后,就我的情况而言,我已经解决了这个问题。