gpt4 book ai didi

sql - 向另一个数据库的用户/角色授予对一个数据库的访问权限

转载 作者:行者123 更新时间:2023-12-02 13:18:34 25 4
gpt4 key购买 nike

简短版本:我可以向角色授予对外部数据库的访问权限吗?

长版:

我正在使用 Crystal 处理报告,该报告从应用程序 SQL Server 实例 ( database1 ) 检索数据。

应用程序正在运行报告并覆盖报告中的连接,我无权访问应用程序代码。

我已向服务器 ( database2 ) 添加了一个新数据库,该数据库正在从电话交换机收集信息,我想将其中一些信息加入到应用程序数据 ( database1 ) 中。

我可以加入数据,并且报告在设计器内运行时可以工作(以 SA 身份登录),但是当报告通过应用程序在外部运行时,它们会失败并出现相当通用的错误(无法检索数据)。

我假设错误是由新的数据库权限引起的,就像我以 SA 身份登录应用程序一样,错误就会消失。

应用程序为运行报告的用户提供了一个特殊的数据库角色,当将表/ View /sp添加到应用程序数据库( database1 )时,我可以简单地向该角色授予选择/执行权限,以允许报告访问对象。

现在我在不同的数据库中有对象,但该角色不容易访问。

有什么方法可以通过现有角色引用第二个数据库( database2 )?

例如:

USE [database1]
GRANT EXECUTE ON [database2].[dbo].[CUSTOM_PROCEDURE] TO [applicationrole1]

OR

USE [database2]
GRANT EXECUTE ON [dbo].[CUSTOM_PROCEDURE] TO [database1].[dbo].[applicationrole1]

理想情况下,我希望能够以某种方式链接到角色,而不是重新创建新角色,因为添加/配置新用户时应用程序会定期更新角色。

(未使用 Crystal-Reports 标记,因为这与问题无关)

编辑:

有什么办法可以做到这样的事情:

INSERT INTO Database2.sys.database_principals
SELECT * FROM Database1.sys.database_principals
WHERE [type] = 'S'

要复制用户(而不是登录名)然后添加角色成员吗?

最佳答案

据推测,您将使用可以访问这两个数据库的登录名(例如 SA 的情况)。您需要创建适当的角色并授予每个数据库的权限,然后在这两个数据库中创建用户(链接到您正在使用的登录名),将每个角色添加到您创建的角色中。

T-SQL 看起来像这样:

use master
go
create login testuser with password = 'mypassword123'
go

use test
go

create role reporting
grant select on something to reporting -- grant your permissions here

create user testuser for login testuser
exec sp_addrolemember 'reporting', 'testuser'
go

use test2
go

create role reporting
grant select on something2 to reporting -- grant your permissions here

create user testuser for login testuser
exec sp_addrolemember 'reporting', 'testuser'
go

现在我可以连接到 test并执行

 select * from something
select * from test2.dbo.something2

当然,您可以将所需的存储过程的授予权限更改为 EXECUTE,但看起来您已经涵盖了这一点。

之后,只需执行一个简单的脚本来创建登录名、用户并将它们添加到角色。

declare @sql nvarchar(max), @username nvarchar(50), @password nvarchar(50)

-- ########## SET PARAMETERS HERE
SET @username = N'testguy'
SET @password = N'test123'
-- ########## END SET PARAMETERS

set @sql = N'USE master; CREATE LOGIN [' + @username + N'] WITH PASSWORD = N''' + @password + N'''; USE database1; CREATE USER [' + @username + N'] FOR LOGIN [' + @username + N']; EXEC sp_addrolemember ''reporting'', ''' + @username + N'''; USE database2; CREATE USER [' + @username + N'] FOR LOGIN [' + @username + N']; EXEC sp_addrolemember ''reporting'', ''' + @username + N''';'
exec sp_executesql @sql

自动同步登录名、用户和角色

此脚本将查找所有 SQL 登录名(您可以将其更改为对您有意义的任何内容;Windows 和 SQL 帐户、包含特定字符串的帐户等),确保用户已在 database1 中创建。和database2 ,并确保它们都添加到 reporting角色。您需要确保reporting角色已在两个数据库上创建,但您只需执行一次。

之后,您可以手动或使用 SQL 代理作业定期运行此脚本。您所需要做的就是为服务器创建登录名;当脚本运行时,它将完成剩下的工作。

declare @login nvarchar(50), @user1 nvarchar(50), @user2 nvarchar(50), @sql nvarchar(max), @rolename nvarchar(50)

SET @rolename = 'reporting'

declare c cursor for
select sp.name as login, dp1.name as user1, dp2.name as user2 from sys.server_principals as sp
left outer join database1.sys.database_principals as dp1 on sp.sid = dp1.sid
left outer join database2.sys.database_principals as dp2 on sp.sid = dp2.sid
where sp.type = 'S'
and sp.is_disabled = 0

open c

fetch next from c into @login, @user1, @user2

while @@FETCH_STATUS = 0 begin

-- create user in db1
if (@user1 is null) begin
SET @sql = N'USE database1; CREATE USER [' + @login + N'] FOR LOGIN [' + @login + N'];'
EXEC sp_executesql @sql
end

-- ensure user is member of role in db1
SET @sql = N'USE database1; EXEC sp_addrolemember '''+ @rolename + ''', ''' + @login + N''';'
EXEC sp_executesql @sql

-- create user in db2
if (@user2 is null) begin
SET @sql = N'USE database2; CREATE USER [' + @login + N'] FOR LOGIN [' + @login + N'];'
EXEC sp_executesql @sql
end

-- ensure user is member of role in db2
SET @sql = N'USE database2; EXEC sp_addrolemember '''+ @rolename + ''', ''' + @login + N''';'
EXEC sp_executesql @sql

fetch next from c into @login, @user1, @user2
end


close c
deallocate c

您将需要添加事务和错误处理来滚出不完整的更改,但我会将其留给您。

关于sql - 向另一个数据库的用户/角色授予对一个数据库的访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11081334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com