Как лучше всего реализовать сценарий SQL, который будет предоставлять разрешения роли базы данных для всех пользовательских таблиц в базе данных?

Как лучше всего реализовать сценарий SQL, который будет предоставлять права выбора, ссылки, вставки, обновления и удаления для роли базы данных для всех пользовательских таблиц в базе данных?

В идеале этот сценарий можно запускать несколько раз по мере добавления новых таблиц в базу данных. SQL Server Management Studio генерирует сценарии для отдельных объектов базы данных, но я ищу сценарий «запустил и забыл».

Разве не для этого нужны роли db_datareader и db_datawriter? Или их не было, когда был задан этот вопрос?

Edwin Stoteler 17.09.2015 16:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
3 539
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я уверен, что есть более простой способ, но вы можете просмотреть таблицу sysobjects в базе данных и предоставить разрешения любым существующим объектам таблицы пользователей. Затем вы можете запускать это несколько раз при добавлении новых таблиц.

Ответ принят как подходящий

Доктор Циммерман здесь на правильном пути. Я бы хотел написать хранимую процедуру, в которой курсор перебирает пользовательские объекты, используя немедленное выполнение, чтобы повлиять на грант. Что-то вроде этого:

 IF EXISTS (
    SELECT 1 FROM sysobjects
    WHERE name = 'sp_grantastic'
    AND type = 'P'
)
DROP PROCEDURE sp_grantastic
GO
CREATE PROCEDURE sp_grantastic
AS
DECLARE
 @object_name VARCHAR(30)
,@time       VARCHAR(8)
,@rights     VARCHAR(20)
,@role       VARCHAR(20)

DECLARE c_objects CURSOR FOR
    SELECT  name
    FROM    sysobjects
    WHERE   type IN ('P', 'U', 'V')
    FOR READ ONLY

BEGIN

    SELECT  @rights = 'ALL'
           ,@role = 'PUBLIC'

    OPEN c_objects
    WHILE (1=1)
    BEGIN
        FETCH c_objects INTO @object_name
        IF @@SQLSTATUS <> 0 BREAK

        SELECT @time = CONVERT(VARCHAR, GetDate(), 108)
        PRINT '[%1!] hitting up object %2!', @time, @object_name
        EXECUTE('GRANT '+ @rights +' ON '+ @object_name+' TO '+@role)

    END

    PRINT '[%1!] fin!', @time

    CLOSE c_objects
    DEALLOCATE CURSOR c_objects
END
GO
GRANT ALL ON sp_grantastic TO PUBLIC
GO

Тогда можно выстрелить и забыть:

EXEC sp_grantastic

Мы используем нечто подобное там, где я работаю. Цикл по всем таблицам, представлениям, хранимым процедурам системы.

CREATE PROCEDURE dbo.SP_GrantFullAccess 
    @username varchar(300)
AS

DECLARE @on varchar(300) 
DECLARE @count int
SET @count = 0

PRINT 'Granting access to user ' + @username + ' on the following objects:'

DECLARE c CURSOR FOR 
SELECT name FROM sysobjects WHERE type IN('U', 'V', 'SP', 'P') ORDER BY name
OPEN c 
FETCH NEXT FROM c INTO @on 
WHILE @@FETCH_STATUS = 0 
BEGIN 
 SET @count = @count + 1
 EXEC('GRANT ALL ON [' + @on + '] TO [' + @username + ']') 
 --PRINT 'GRANT ALL ON [' + @on + '] TO ' + @username
 PRINT @on
 FETCH NEXT FROM c INTO @on 
END 
CLOSE c 
DEALLOCATE c

PRINT 'Granted access to ' + cast(@count as varchar(4)) + ' object(s).'
GO

Есть недокументированная процедура MS под названием sp_MSforeachtable, которую вы могли бы использовать, которая определенно существует в 2000 и 2005 годах.

Чтобы предоставить права выбора, использование будет следующим:

EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName'

Чтобы предоставить другие разрешения, либо создайте новый оператор для каждого из них, либо просто добавьте их в команду следующим образом:

EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName; Grant Delete on ? to RoleName;'

Немного поиграв, можно было бы также превратить имя роли в параметр.

use [YourDb]
GO
exec sp_MSforeachtable @command1=
    "GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON ? TO Admins, Mgmt",
    @whereand = " and o.name like 'tbl_%'"
GO

use [YourDb]
GO
exec sp_MSforeachtable @command1=
    "GRANT REFERENCES, SELECT ON ? TO Employee, public",
    @whereand = " and o.name like 'tbl_%'"
GO

Другие вопросы по теме