2011-09-13 4 views
0

一括挿入:私はSQL Server Management Studioのから、それを実行したときに私はいくつかのファイルからの一括挿入を行い、ストアドプロシージャ持つ問題

CREATE PROCEDURE [dbo].[SP_BulkInsert] @FileName NVARCHAR(200) AS 
BEGIN 
DECLARE @bulkinsert NVARCHAR(1000) 

SET @bulkinsert = N'BULK INSERT TblTemp FROM ''' + @FileName + 
     N''' WITH (FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')' 

EXEC sp_executesql @bulkinsert 

RETURN @@ROWCOUNT 
END 

このストアドプロシージャが正常に動作しますが、私はExecuteNonQueryでそれを実行しようとすると、 ADO.NETの私は、次のエラーを取得する:

"The INSERT permission was denied on the object 'TblTemp', database 'TempDB', schema 'dbo'."

重要:(SELECT/INSERT/DELETE/UPDATEを作る)他のすべてのストアドプロシージャは、ADO.NETから罰金実行します。

すべてのものが実行されるユーザーはbulkadminロールのメンバーであり、カスタムdb_executerロール(EXECUTE権限のみを持つ)のメンバーです。

コードは、ストアドプロシージャの多くのために正常に動作、失敗したのは初めてのことだ。.. これは私がしている同じユーザー名/パスワードでSSMSにログイン機能

public static int BulkInsert(string fileName) 
{ 
    SqlParameter paramFileName = new SqlParameter("FileName", fileName); 
    SqlParameter paramRetValue = new SqlParameter(); 
    paramRetValue.Direction = ParameterDirection.ReturnValue; 
    SqlParameter[] @parameters = { paramFileName, paramRetValue }; 
    SqlHelper.ExecuteNonQuery(ConnectionSettings.ConnectionString, 
    CommandType.StoredProcedure, "SP_BulkInsert", parameters, true); 

    return (int)paramRetValue.Value; 
} 

です

Management Studioでストアドプロシージャが成功するのはなぜですか、ADO.NET経由では(上記のエラーメッセージで)失敗するのはなぜですか。

+0

使用しているADO.NETコードを表示できますか? –

+0

@ marc_s。多くのストアドプロシージャでコードが正常に動作します。 ExecuteNonQuery(ConnectionSettings.ConnectionString、CommandType.StoredProcedure、 "SP_SomeBulkInsert"、parameters、true); ExecuteNonQuery(ConnectionSettings.ConnectionString、CommandType.StoredProcedure、 "SP_SomeBulkInsert"、parameters、true); – Ilan

+1

ありがとう - しかし、あなたは元の質問にこれを入れてください。また、重要で興味深いのは、接続文字列、接続の設定方法などです** **ただ一つの行だけではありません! –

答えて

1

sp_executesqlを介してSQLを実行すると、ストアドプロシージャで直接使用されるアクセス許可とは異なるアクセス許可が使用されます。私はストアドプロシージャを実行しているユーザーが(この例では)テーブル "TblTemp"に対してINSERT権限を持っているかどうかを確認することをお勧めします。 SQL ServerのManagement Studioでこれを行うには

...

  • はテーブル
  • のリストを展開し、右適切なものをクリックして、「権限」タブでプロパティ
  • を選択し、クリックしてください"追加..."ボタン。
  • ユーザーまたはロールを入力するか、[参照]をクリックします。 「{ユーザー名/役割}の明示的なアクセス許可」の管理Studioでなければなりません
  • [OK]をクリックし
+0

私は同じストアドプロシージャ 'SP_BulkInsert'を実行します.. Management StudioではADO.NETを使用して成功しません。なぜですか? – Ilan

+0

ADOでストアドプロシージャを実行しているのと同じユーザー名/パスワードでSSMSにログインしていますか?私の経験では、通常のTSQLステートメントを含むストアドプロシージャは、ユーザーがテーブルに対して直接SELECT/INSERT/UPDATE/DELETE権限を持っていなくても正しく実行されます。ただし、そのTSQLステートメントが動的sp_executesqlコマンドで実行されている場合、そのユーザーが同じユーザーを使用しているとは考えられないため、テーブルに対して正しいアクセス許可が与えられていません。 – freefaller

+0

私はADO.NET側の接続文字列にある同じユーザー名/パスワードでSSMSにログインしています。したがって、どのユーザーSQLサーバーが動的クエリを実行していますか?どうすればそのパーミッションを知ることができますか? – Ilan

0

で適切な権限のトップテーブルで選択したユーザーまたはロールを持つ

  • 、ダニ「グラント」すべての権限を持つsaアカウントで実行されますが、ADO.NETを介して接続しているユーザーには正しい権限が設定されていない可能性があります。管理スタジオを介してユーザーに書き込み権限を与える必要があります。ユーザーリストを見てください。

  • +0

    私はADO.NET側の接続文字列にある同じユーザー名/パスワードでSSMSにログインしています。私はこの点を質問に追加しましたが、ありがとう.. – Ilan

    関連する問題