Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我是否可以授予存储过程设置标识插入的权限?_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 我是否可以授予存储过程设置标识插入的权限?

Sql 我是否可以授予存储过程设置标识插入的权限?,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有一个存储过程,我希望在不给调用它的受限用户ALTER TABLE特权的情况下授予插入标识的权限。可能吗 以下是我的存储过程: CREATE PROCEDURE [dbo].[AddInternalQu] ( @id [int], @qu [nvarchar](500), @pg [nvarchar](50), @isactive [bit], @isdoc [bit], @allowNA [bit], @textBox [bit],

我有一个存储过程,我希望在不给调用它的受限用户ALTER TABLE特权的情况下授予插入标识的权限。可能吗

以下是我的存储过程:

CREATE PROCEDURE [dbo].[AddInternalQu] 
(
    @id [int],
    @qu [nvarchar](500),
    @pg [nvarchar](50),
    @isactive [bit],
    @isdoc [bit],
    @allowNA [bit],
    @textBox [bit],
    @redf [bit],
    @qord [int],
    @shqu [nvarchar](50),
    @restrict [bit],
    @scanwizard [bit]
)
AS
BEGIN
    SET IDENTITY_INSERT [questions] ON;

    INSERT INTO [questions] (qu_id, question, shortqu, redflag, page, active, is_doc_qu, 
                             allowNA, textBox, qu_order, scanwizard, restricted) 
    VALUES(@id, @qu, @shqu, @redf, @pg, @isactive, @isdoc, 
           @allowNA, @textBox, @qord, @scanwizard, @restrict);

    SET IDENTITY_INSERT [questions] OFF;
END

GRANT EXEC ON AddInternalQu TO MyStandardRole;
就目前情况而言,我添加到
MyStandardRole
角色的用户有权执行存储过程,但在权限不足的情况下,它无法尝试设置标识插入。

“以所有者身份执行”应该可以做到这一点

CREATE PROCEDURE [dbo].[AddInternalQu] 
(
    @id [int],
    @qu [nvarchar](500),
    @pg [nvarchar](50),
    @isactive [bit],
    @isdoc [bit],
    @allowNA [bit],
    @textBox [bit],
    @redf [bit],
    @qord [int],
    @shqu [nvarchar](50),
    @restrict [bit],
    @scanwizard [bit]
)
WITH EXECUTE AS OWNER
AS
BEGIN
    SET IDENTITY_INSERT [questions] ON;

    INSERT INTO [questions] (qu_id, question, shortqu, redflag, page, active, is_doc_qu, 
                             allowNA, textBox, qu_order, scanwizard, restricted) 
    VALUES(@id, @qu, @shqu, @redf, @pg, @isactive, @isdoc, 
           @allowNA, @textBox, @qord, @scanwizard, @restrict);

    SET IDENTITY_INSERT [questions] OFF;
END

GRANT EXEC ON AddInternalQu TO MyStandardRole;

不管怎样,这都是个坏主意。不应从存储的进程调用Identity_insert,因为您不应该经常查看Identity设置。如果你想绕过identiy,那么你不应该有identity列。此设置仅用于偶尔从其他系统等传输数据,而不用于用户可以访问的存储过程中的日常使用。你到底为什么要这么做?有些问题是硬编码的系统问题,我希望它们有固定的ID。我仍然需要自动识别所有其他问题。我可以看出改变设计会更好,但这是一个很大的改变。