我正在试图弄清楚是否有办法实现与此相反: can a SQL Server stored proc execute with higher permission than its caller?
我想创建一个存储过程,如果用户在某个角色中,它会执行一项操作,但如果不是,则创建一个后备选项。
我的第一次尝试尝试查询当前用户的角色,基于此: How to query current user's roles
我试图查询用户所处的角色,并根据该角色决定做什么。但是,如果将“mydomain \ Domain Users”设置为某个角色(例如),则属于Domain Users的用户不会列在sys.database_role_members视图中。因此,应该拥有权限的用户不会。
从这里https://msdn.microsoft.com/en-us/library/ee677633.aspx
IS_ROLEMEMBER always returns 0 when a Windows group is used as the database
principal argument, and this Windows group is a member of another Windows
group which is, in turn, a member of the specified database role.
我的下一次尝试就像这样。使用实际权限创建存储过程,然后使用包含它的包装器调用具有较低权限的存储过程,如果失败,则执行回退操作:
CREATE PROCEDURE [internal_myproc]
AS
BEGIN
-- do something here
END
GO
GRANT EXECUTE ON [internal_myproc] TO [Role1] AS [dbo]
GO
CREATE PROCEDURE [myproc]
AS
BEGIN
BEGIN TRY
EXEC [internal_myproc]
END TRY
BEGIN CATCH
-- perform fallback action
END CATCH
END
GO
GRANT EXECUTE ON [internal_myproc] TO [Role1] AS [dbo]
GO
GRANT EXECUTE ON [internal_myproc] TO [Role2] AS [dbo]
GO
GRANT EXECUTE ON [internal_myproc] TO [Role3] AS [dbo]
GO
这个问题是[Role1]和[Role2]都成功通过[myproc]执行[internal_myproc]。如果从存储过程中取出代码,它的行为方式应该如此,但由于它隐藏在存储过程中,因此它获得了执行其他存储过程的隐式权限。我已尝试过“WITH EXECUTE AS”的东西,但它似乎没有改变任何东西。
我还试过“如果HAS_PERMS_BY_NAME('internal_myproc','OBJECT','EXECUTE')= 1”,这里建议MS SQL Server: Check to see if a user can execute a stored procedure,但这似乎在我尚未理解的某些情况下不起作用。
有没有办法不授予这些隐式权限,在存储过程中进行权限检查?或等同的东西?