具有更高权限的 SQL Server 中的过程

Posted

技术标签:

【中文标题】具有更高权限的 SQL Server 中的过程【英文标题】:Procedure in SQL Server with higer permission 【发布时间】:2011-12-03 13:19:03 【问题描述】:

我需要那个用户调用程序,它将以 exec 作为登录名更改上下文。问题,如果用户没有系统管理员服务器角色,它会产生错误

无法作为服务器主体执行,因为主体 “copy_user”不存在,这种类型的主体不能 被冒充,或者您没有权限。

如果我给用户 sysadmin 服务器角色,一切正常。

declare @ret int
exec @ret = testProc @id = 0
select @ret

而且手续很简单

ALTER PROCEDURE testProc
    @id int
AS
BEGIN
    declare @c int

    exec as login = 'copy_user'
    select @c = COUNT(*) from Customers
    REVERT

    return @c;
END
GO

它应该/将复制数据到其他数据库,所以让用户使用 sysadmin 登录不是很好。

我还冒充 copy_user:

GRANT IMPERSONATE ON LOGIN::copy_user TO copy_user WITH GRANT OPTION
GRANT ALTER ANY LOGIN TO copy_user

GRANT IMPERSONATE ON USER::copy_user TO copy_user WITH GRANT OPTION
GRANT ALTER ANY USER TO copy_user
GRANT SELECT, INSERT, UPDATE, DELETE TO copy_user WITH GRANT OPTION

GRANT IMPERSONATE ON USER::cp TO copy_user

一般来说,我需要可以将数据插入其他数据库(在同一台服务器上)的程序,但不允许当前用户访问它。

【问题讨论】:

【参考方案1】:

我不确定我是否遵循您想要实现的目标。

如果您希望数据库用户只能通过存储过程而不是直接访问数据,那么您只需授予相关用户对存储过程的执行权限即可。用户将无法直接访问数据库数据。

【讨论】:

用户可以访问表中的一些数据或执行程序,我需要的是允许在某些程序中切换执行上下文以登录可以访问不同的数据库并在那里写入一些数据。现在只能为具有 sysadmin 服务器角色的用户切换上下文的问题,我真的不想对所有用户都这样做。 为什么“需要”切换执行上下文?有问题的数据库用户是否在两个数据库中都不存在?您是否启用了跨数据库所有权链接? 我希望用户只在一个数据库中,并且不允许他连接到第二个数据库。原因是有两家公司在一个数据库中有一些共同的数据供双方使用,并且从一个表中的数据应该为每个公司提供单独的数据库。因此,如果我在所有数据库中创建用户来写入数据,他将能够连接到其他公司数据库(并且有可能更改它),我想避免这种情况。

以上是关于具有更高权限的 SQL Server 中的过程的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER2008 存储过程表视图函数的权限

sql server dbowner 权限 实战

SQL server数据库之存储过程

SQL Server 查询以查找数据库中所有用户的所有权限/访问权限

Tableau Server 中的直接 SQL Server 连接,业务用户没有数据库的读取权限

C# 中的日期时间与 SQL Server 中的 SQL 和 GETDATE()