问题描述
注意:我已经检查了这个问题和答案,但它没有回答我的用例:Permission for querying dbo.sysobjects
如果序列不存在,我有以下存储过程来创建它:
ALTER PROCEDURE seq.CreateSequenceIfNotExists
@FullSequenceName nvarchar(500)
WITH EXECUTE AS 'SequenceCreator'
AS
BEGIN
SET NOCOUNT ON;
IF (NOT EXISTS (SELECT 1
FROM sys.objects
WHERE object_id = OBJECT_ID(@FullSequenceName) AND type = 'SO'))
BEGIN
DECLARE @SequenceCreatesql NVARCHAR(700)
SET @SequenceCreatesql = CONCAT('CREATE SEQUENCE ',@FullSequenceName,'START WITH 1 INCREMENT BY 1 NO CACHE')
EXEC sp_executesql @stmnt = @SequenceCreatesql
END
END
GO
它作为 (SequenceCreator
) 运行的用户只有以下权限:
GRANT CREATE SEQUENCE ON SCHEMA::seq TO SequenceCreator
GO
当这个存储过程运行时,它可以很好地创建序列。但是当我第二次运行它时,对 sys.objects
的查询不返回任何行,它尝试再次创建一个序列(当我将它作为 dbo
运行时它返回一行(正如预期的那样))。
我假设用户 SequenceCreator
无权查询 sys.objects
中的这一行。
允许此用户检查其创建的序列是否存在所需的最低权限是多少?
(注意:我需要它是“最小权限”,因为我不能参数化序列的名称,所以它可能会被 sql 注入攻击击中。虽然在我的使用中不太可能情况下,我需要用户没有任何真正的权限来利用)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)