web-dev-qa-db-ja.com

SQL Server 2000のすべてのテーブル、ビュー、プロシージャへのアクセス許可を付与する

T-SQLをSQL Server 2000構文で使用して、特定のデータベースのすべてのTABLESとVIEWSに対してGRANT SELECT、INSERT、UPDATE、DELETEを実行し、100を超えるオブジェクトのうち2つまたは3つを除外するかなり効率的な方法があるかどうか疑問に思いました。また、すべてのストアドプロシージャに対するEXEC権限を付与できるようにしたいと考えています。

現在、以下のコードを使用して、1つずつ変更しています。約100のテーブルと100のビューに対してこれを行うと、時間がかかりすぎ、GUIでさらに時間がかかります(私が間違っている場合を除きます)。

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
Geoff Dawdy

ああ、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;
8
Aaron Bertrand