Sql 我是否可以授予存储过程设置标识插入的权限?
我有一个存储过程,我希望在不给调用它的受限用户ALTER TABLE特权的情况下授予插入标识的权限。可能吗 以下是我的存储过程: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],
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。我仍然需要自动识别所有其他问题。我可以看出改变设计会更好,但这是一个很大的改变。