首页 > 解决方案 > 为同一用户创建的序列查询 sys.objects 所需的权限

问题描述

注意:我已经检查了这个问题和答案,但它没有回答我的用例:查询 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 注入攻击。虽然在我的用例中不太可能,但我需要用户没有任何真正的利用权限)

标签: sql-servertsqlsql-server-2017

解决方案


推荐阅读