一時ストアドプロシージャでの所有権の継承について、
Books Online に明確な表記がないようでしたので、
簡単にテストしてみました。
この件は、PASSJ セキュリティ分科会のML にもだしました
■概要
## で始まる一時ストアドプロシージャでは、
所有権の継承は行われない
■テスト
SQL Server 2000 SP3a
Windows 2000 Server
■内容
ストアドプロシージャは、通常、所有権の継承が行われます。
しかし、##test のように ## で、始まる名前をもつ
一時ストアドプロシージャは、継承されていませんでした。
例:
ログイン sa で接続して、
create procedure ##t
as
select top 1 * from pubs.dbo.titles
go
とします。
次にログイン userA を作成したあと、
pubs にユーザー userA を追加し、
titles テーブルへのアクセスを拒否します。
exec sp_addlogin 'UserA', 'password', 'pubs'
use pubs
exec sp_grantdbaccess 'UserA'
deny select on titles to [UserA]
次に、UserA でデータベースに接続し、##t を実行します。
すると、次のエラーになります。
「SELECT 権限は、オブジェクト 'titles'、
データベース 'pubs'、所有者 'dbo' にありません。」
テスト終了後、ログイン,ユーザーを削除します
exec sp_revokedbaccess 'UserA'
exec sp_droplogin 'UserA'
■背景
## で始まる一時ストアドプロシージャは、
どのログインからでも呼び出すことができます。
さらに、特定のログインやユーザーにのみ、実行を
許可したり、拒否する機能がありません。
したがって、このようなストアドプロシージャの実装時には、
各自が適切なユーザーからのみ呼び出せるようにする
必要があるのではないかと考えました
たとえば、SYSTEM_USER を評価して、適切なログインのみ
実行を許可するという方法です。
例:
create procedure ##t2
as
SELECT SYSTEM_USER
IF SYSTEM_USER <> 'DOMAIN\UserP'
RETURN
SELECT 'OK'
go
exec ##t2
今回、所有権の継承が行われていないことが
確認できましたので、特にこのような実装は必要ないかと
思います。
※もしかしたら、継承させる方法があるのかもしれませんが。
※継承できないのは、それはそれで、使いにくい場合もあるかも。