我已经实现了存储过程来检查是否存在特定的[schema].[procedure]
。
CREATE PROCEDURE [BlobCheckExisting].[usp_DoesStoredProcedureExist]
@schemaName varchar(128),
@procedureName varchar(128)
AS
SELECT IIF (EXISTS (SELECT 1 FROM sys.procedures p INNER JOIN sys.schemas s ON p.[schema_id] = s.[schema_id]
WHERE s.[name] = @schemaName AND p.[name] = @procedureName), 1, 0)
GO
当我使用sa
它进行测试时,我按预期选择了 1,但是当我尝试使用仅授予EXECUTE
该程序的最小权限帐户时,它选择了 0。
我对存储过程机制的假设是角色/用户只需要EXECUTE
执行该过程。我们不需要关心每个数据库对象的权限设置,比如 CRUD 到 table 等等。
但似乎 sys 表是例外?还是我错过了什么?
此外,如果我不想将 select sys.procedures
/授予sys.schemas
该角色。我只希望我的程序按预期工作,我该怎么办?
当所有权链接适用时,此陈述是正确的。使用完整的链,用户不需要间接引用对象的权限。
但是,在从目录视图中进行选择时,所有权链接不会应用元数据可见性。必须授予用户对对象的某些权限,以便在从目录视图中选择对象时可见。
下面是一个为您的用例显示此行为的脚本。如果您需要返回用户无权使用的对象,则需要使用
EXECUTE AS
证书签名或证书来提升BlobCheckExisting.usp_DoesStoredProcedureExist
过程用户的权限。