0

SQL Server 2000 から SQL Server 2008、次に SQL Server 2012 へのアップグレードを開始しています (2000 から 2012 に直接移行することはできません)。

SQL Server 2000 のストアド プロシージャの 1 つは、指定された値であるビュー@ErrorMsgから name 列にの値を設定します。これらの目的のために、ビューに存在する名前を探しているとしましょう。sys.objectsnamezz_BICWS_PersonInfo_Search_1000000000000000000sys.objects

プロシージャは SQL Server 2000 で機能し、SQL Server 2012 で次のコードを実行すると、正しい名前が返されますが、SQL Server 2012 のストアド プロシージャでは返されません。

declare @ErrorMsg varchar(1000)

set @ErrorMsg = 'xxxxxxx'

select @ErrorMsg = name
    from bic.dbo.sysobjects 
    Where name = 'zz_BICWS_PersonInfo_Search_10000000000000000000'

print 'test ' + @ErrorMsg

これらと同じ行がストアド プロシージャに存在しますが、print 行を除いて、@ErrorMsgプロシージャを呼び出すアプリに出力されます。ただしxxxxxx、アプリのメッセージ ボックスを使用して初期値を返し、戻り値を表示します。

しかし、where句を次のように変更すると

Where name Like ‘zz_BICWS_PersonInfo_Search_%’  

(これに一致する行は約 40 行あります) 次に、見つかった最初の行の名前を取得します。

4

2 に答える 2

1

別のフォーラムのおかげで、私は答えを受け取りました。同じ問題が発生する可能性のある他の人のために、ここに投稿します。

SQL2000以降のバージョンには重要な違いがあります。SQL 2000では、すべてのメタデータがすべてのユーザーに表示され、変更する方法はありませんでした。

SQL 2005以降では、権限がある場合にのみメタデータを表示できます。SELECTステートメントは、アプリケーションのプレーンユーザーによって実行されたときに、行にヒットしません。ただし、saとして接続されたSSMSで、または少なくともdb_owner権限でSELECTを実行すると、すべてが機能します。

メタデータが表示されていることに依存している場合は、適切なユーザーにVIEWDEFINITIONのアクセス許可を付与する必要があります。

アプリユーザーにビューの定義を付与

データベース内のすべてのオブジェクトのVIEWDEFINITIONをロールappusersに付与します。このステートメントは、dboスキーマ内のすべてのオブジェクトに対するアクセス許可を付与します。

SCHEMA::dboのビュー定義をappusersに付与

SELECTまたはEXECUTE権限があるオブジェクトには、VIEWDEFINITION権限が含まれています。

于 2012-08-09T13:04:29.477 に答える
0

そこで質問を見つけるのに少し苦労していますが、問題は、40 行を 1 つの変数に詰め込もうとしていることにあると思います。

@ErrorMsg 変数をドロップして、これを実行してみてください。

select name
from bic.dbo.sysobjects 
Where name = 'zz_BICWS_PersonInfo_Search_10000000000000000000'
于 2012-08-07T20:51:17.677 に答える