ネタ元:SQLSERVER2008 カラムの読み取り属性の設定について - Database Expert会議室
テーブル単位では出来るのを知っていたので少し調べてみたら、列単位でも出来るみたい。
MSDN SQL Server 2008 オンライン ブック (2009 年 7 月)GRANT (オブジェクトの権限の許可) (Transact-SQL)
MSDN SQL Server 2008 オンライン ブック (2009 年 7 月)DENY (オブジェクトの権限の拒否) (Transact-SQL)
CREATE USER [TestUser] FOR LOGIN [Test] GO CREATE TABLE [TestTable] ( [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, [Name] NVARCHAR(10) NULL, ) GO GRANT SELECT ON [TestTable] TO [TestUser] -- TestTable の SELECT 権限を与える DENY SELECT ON [TestTable] ([Id]) TO [TestUser] -- TestTable の Id 列の SELECT 権限を拒否する GO INSERT INTO [TestTable] VALUES ('aaa') INSERT INTO [TestTable] VALUES ('bbb') /* 該当のユーザーで実行する SELECT * FROM [TestTable] -- エラーになる SELECT [Name] FROM [TestTable] -- エラーではない */ /* 試し終わったら、ユーザーとテーブルの削除 DROP USER [TestUser] DROP TABLE [TestTable] */
ちなみに SELECT を拒否している列をストアドで返す様にし、ストアドの実行権限を与えると参照出来ます。ストアド等の権限も注意しないとダメですね。
CREATE PROCEDURE [TestSelect] AS BEGIN SET NOCOUNT ON; SELECT * FROM TestTable END GO GRANT EXECUTE ON [TestSelect] TO [TestUser] GO /* 該当のユーザーで実行する EXEC [TestSelect] */