Как лучше всего реализовать сценарий SQL, который предоставит роли базы данных разрешения на все пользовательские таблицы в базе данных?
-
09-06-2019 - |
Вопрос
Как лучше всего реализовать сценарий SQL, который будет предоставлять разрешения на выбор, ссылки, вставку, обновление и удаление роли базы данных для всех пользовательских таблиц в базе данных?
В идеале этот скрипт можно запускать несколько раз по мере добавления новых таблиц в базу данных.SQL Server Management Studio генерирует сценарии для отдельных объектов базы данных, но мне нужен сценарий «выстрелил и забыл».
Решение
Доктор Циммерман здесь на правильном пути.Я хотел бы написать хранимую процедуру, в которой курсор будет проходить через пользовательские объекты, используя немедленное выполнение, чтобы повлиять на грант.Что-то вроде этого:
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
Другие советы
Я уверен, что есть более простой способ, но вы можете просмотреть таблицу sysobjects в базе данных и предоставить разрешения любым существующим объектам таблицы пользователей.Затем вы можете запускать это несколько раз при каждом добавлении новых таблиц.
Существует недокументированная процедура 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;'
Немного поигравшись, можно также превратить имя роли в параметр.
Там, где я работаю, мы используем нечто подобное.Циклический просмотр всех таблиц, представлений и хранимых процедур системы.
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
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