У меня есть хранимая процедура, которой я хотел бы дать разрешение на вставку идентификаторов, не давая ограниченному пользователю, вызывающему ее, привилегии 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, имеет права на выполнение хранимой процедуры, но затем ему не удается установить идентификационную вставку с недостаточными привилегиями.

6
noelicus 18 Авг 2014 в 21:09
1
Это плохая идея, несмотря ни на что. Identity_insert не следует вызывать из хранимой процедуры, потому что вам не следует постоянно обходить настройку идентификатора. Если вы хотите обойти идентификацию, у вас не должно быть столбца идентификации. Этот параметр предназначен только для очень случайной передачи данных из других систем и т.п., но никогда для ежедневного использования в хранимой процедуре, к которой пользователь может получить доступ. Почему ты хочешь делать такие вещи?
 – 
HLGEM
18 Авг 2014 в 21:43
1
Некоторые из вопросов являются жестко закодированными системными вопросами, и я хочу, чтобы у них были фиксированные идентификаторы. Мне все еще нужен автоматический идентификатор для всех других вопросов. Я вижу, что было бы лучше изменить дизайн, но это большое изменение.
 – 
noelicus
18 Авг 2014 в 21:53

1 ответ

Лучший ответ

«ИСПОЛНИТЬ КАК ВЛАДЕЛЬЦА» должно помочь.

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;
9
Jim V. 18 Авг 2014 в 21:26