2008-09-04 5 views
2

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

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

+1

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

ответ

1

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

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 '[email protected]) 

    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 
2

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

0

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

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 
2

Там есть недокументированная процедура 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;' 

С небольшим количеством игр вокруг него возможно включить имя роли в параметр.

0
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