Разрешения GRANT для всех таблиц, представлений, процедур в SQL Server 2000

8

Мне было интересно, существует ли достаточно эффективный способ использования T-SQL с синтаксисом SQL Server 2000 для GRANT SELECT, INSERT, UPDATE, DELETE для всех таблиц и VIEWS для конкретной базы данных, исключая 2 или 3 из более чем 100 объектов. Я также хотел бы иметь возможность предоставлять привилегии EXEC для всех хранимых процедур.

В настоящее время я использую код ниже, чтобы изменить их один за другим. Выполнение этого для примерно 100 таблиц и 100 представлений занимает слишком много времени и займет еще больше времени через графический интерфейс (если только я не делаю это неправильно).

use [DATABASE_NAME]
GO
GRANT DELETE ON [dbo].[table_name]TO [user_name]
GO
use [DATABASE_NAME]
GO
GRANT INSERT ON [dbo].[table_name]TO [user_name]
GO
use [DATABASE_NAME]
GO
GRANT SELECT ON [dbo].[table_name]TO [user_name]
GO
use [DATABASE_NAME]
GO
GRANT UPDATE ON [dbo].[table_name]TO [user_name]
GO

Как я могу использовать T-SQL для циклического перебора ВСЕХ пользовательских таблиц и представлений для предоставления определенных привилегий при исключении пары объектов?

Джефф Доуди
источник

Ответы:

8

Тьфу, 2000.

Предполагая, что все объекты принадлежат dbo, вы можете сгенерировать скрипт, например:

SELECT N'GRANT INSERT, UPDATE, DELETE, SELECT ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type IN (N'U', N'V');

SELECT N'GRANT EXECUTE ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type = N'P';

Теперь вы можете копировать и вставлять вывод в случае, если вы хотите исключить какие-либо записи или проверить. Если вы просто хотите выполнить вслепую, вы можете вместо этого сделать это, но это зависит от содержимого любого отдельного набора команд, составляющего <4K:

DECLARE @sql NVARCHAR(4000) = N'';

SELECT @sql = @sql + N'GRANT INSERT, UPDATE, DELETE, SELECT ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type = N'U';

EXEC sp_executesql @sql;

SET @sql = N'';

SELECT @sql = @sql + N'GRANT INSERT, UPDATE, DELETE, SELECT ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type = N'V';

EXEC sp_executesql @sql;

SET @sql = N'';

SELECT @sql = @sql + N'GRANT EXECUTE ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type = N'P';

EXEC sp_executesql @sql;
Аарон Бертран
источник