テーブルのカラム単位で権限を付与

ネタ元: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]
*/