テーブル値関数のアクセス許可を付与する方法


21

私はそれを正しくやっていますか...?

私はお金を返す関数を持っています...

CREATE FUNCTION functionName( @a_principal money, @a_from_date
  datetime, @a_to_date datetime, @a_rate float )  RETURNS money AS BEGIN

  DECLARE @v_dint money   set @v_dint = computation_here
     set @v_dint = round(@v_dint, 2)

  RETURN @v_dint    
END 
GO 
Grant execute on functionName to another_user 
Go

これがiTVFに変換できるかどうか疑問に思っていますか?

私はこれを試しましたが、エラーが発生しました:

CREATE FUNCTION functionName ( @a_principal money, @a_from_date
  datetime, @a_to_date datetime, @a_rate float )  
RETURNS TABLE AS 
RETURN SELECT returnMoney = computation_here  
GO  
Grant execute on functionName to another_user  Go

エラー:

メッセージ4606、レベル16、状態1、行2付与または取り消された特権EXECUTEはオブジェクトと互換性がありません。

この関数は次のように使用されます。

update table_name set interest = functionName(col1,col2...) where...

前もって感謝します!


現在テーブルを返しているため、GRANTステートメントはGRANT EXECUTEではなくGRANT SELECTである必要があります。
マイク

回答:


33

スカラー関数にはEXECUTEパーミッションが必要ですが、テーブル値関数に変換した場合、必要なパーミッションはに変更されSELECTます。

あなたは今 GRANT SELECT ON functionName TO another_user;

BOLから:

所有者以外のユーザーは、Transact-SQLステートメントで使用する前に、関数に対するEXECUTE権限を付与する必要があります(関数がスカラー値の場合)。関数がテーブル値の場合、ユーザーは関数を参照する前に関数に対するSELECT権限を持っている必要があります。


そして、ユーザ名が(DOMAINNAME \ユーザー名のようにバックスラッシュのように、)特殊文字を持っているならば、あなたは、角括弧内すなわちをユーザ名を配置する必要があり、別の答えにRDFozzさんのコメントあたり:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme

0

GRANT SELECT ON functionName TO [another_user]括弧で囲む必要があります。


ユーザー名に特殊文字が含まれていない限り、括弧はオプションです。バックスラッシュは特殊文字であり、多くの場合、Windows認証ログインを使用するユーザーのユーザー名の一部となるため、大括弧を使用する習慣を付けるのがおそらく最も安全です。
RDFozz

-4

私は使用しようとしました:

GRANT SELECT ON functionName TO another_user

しかし、それは機能しませんでした、それから、私はのEXECUTE代わりに使用しSELECT、今は動作します


grant executeSQL関数を試みると常にエラーがスローされるため、これをどのように管理したかについて興味があります。
イアン・ケンプ

3
おそらくテーブル値関数ではなかったので、機能しました。
ディエゴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.