SQL Server — роль «Только выполнение хранимой процедуры»

Как создать настраиваемую роль сервера базы данных SQL Server, которая может выполнять только SELECT запросы и хранимые процедуры?

Это означает, что пользователям этой роли не будет разрешено выполнять пользовательские запросы, но они могут запускать хранимые процедуры с операторами CRUD и SysAdmin — UPDATES, DELETES, ALTERS, DROPS.

Я попытался создать эту пользовательскую роль, но потерпел неудачу, когда запустил SP, изменяющий таблицу.

CREATE ROLE SupportStaff
GRANT SELECT TO SupportStaff
GRANT EXECUTE TO SupportStaff

Любые идеи?

Обновлять

Итак, я обнаружил, что приведенный выше код позволяет использовать хранимые процедуры с операторами INSERT/UPDATE/DELETE. Но он не допускает операторов ALTER, TRUNCATE или DROP INDEX.

Для ALTER мне просто нужно добавить GRANT ALTER TO SupportStaff

Но что мне нужно сделать, чтобы разрешить TRUNCATE и DROP INDEX?


person Rafferty    schedule 19.07.2013    source источник
comment
Когда вы запускали обновления, вы вошли в систему как SA или кто-то из группы dbo? Вы не можете изменить таблицу, владельцем которой вы не являетесь.   -  person Brian    schedule 19.07.2013
comment
Я проверил с новым входом в SQL и добавил эту роль SupportStaff этому новому пользователю.   -  person Rafferty    schedule 19.07.2013
comment
Привет, Брайан, я обновил свой вопрос. GRANT ALTER позволяет мне изменять таблицу, интересно, знаете ли вы, как также разрешить TRUNCATE и DROP INDEX?   -  person Rafferty    schedule 19.07.2013
comment
Alter должен работать для удаления индекса и усечения, основываясь на том, что я прочитал. Удачи... Сегодня пятница и я еду домой.   -  person Brian    schedule 19.07.2013


Ответы (1)


создайте роль и сделайте ее членом db_datareader, затем добавьте разрешение EXECUTE для каждой процедуры по отдельности. Пример с пользователем с именем test и членом этой роли. Запустите это как администратор:

CREATE TABLE test (id INT)
GO

CREATE PROCEDURE INSERTtest
AS
begin
INSERT INTO dbo.test
        (id)
VALUES
        (1)
END
GO  

GRANT EXECUTE ON dbo.INSERTtest TO test
GO

Если ваши процедуры вставляют данные в таблицы, и они не нарушают цепочку владения объектом, вы должны быть в порядке с этой настройкой. Попробуйте это с пользователем:

SELECT * FROM dbo.test --sucess
INSERT INTO dbo.test(id)VALUES(1) -- fail
EXEC INSERTtest  --sucess
person Diego    schedule 19.07.2013