おそらく未知のリスクと同じくらい多くの根拠のない恐怖があることを考えると、なぜ彼らが懸念しているのかを作成した人に尋ねることなく、なぜ政策が実施されているのかを本当に言うことは難しいと思います。
しかし、おそらくBULK INSERT
/ SqlBulkCopy
/ BCP / OPENROWSET(BULK ...)
誰かができることと関係があると思います:
- 無効な制約(
CHECK
、DEFAULT
、とFOREIGN KEY
私は信じています)
- トリガーを無効にします(監査トリガーが存在する場合、それらをバイパスすることはおそらく望ましくないと見なされます。この特定の問題の詳細については、@ DVKsの回答を参照してください)
さまざまなオプションについては、次のドキュメントで説明しています。
@RDFozzで指摘されているテーブルロックの問題については言及しませんでした。これは、BULK INSERT
誰もがTABLOCK / XLOCKをテーブル化したり、に設定したりできるTRANSACTION ISOLATION LEVEL
からSERIALIZABLE
です。
更新
これを絞り込むのに役立つ可能性のある2つの追加情報に出会いました。
トリガーを無効にし、制約を無効にし、設定できるという問題は、(SQL Server 2017以降)、またはサーバーの役割を脅威として見るのに圧倒的な理由でIDENTITY_INSERT ON
はないかもしれません。理由は、上記の3つのいずれかを実行するために、ユーザーはそのテーブルまたはテーブルが存在するスキーマに対する権限を持っている必要があるためです。所有権の連鎖はDDLの変更をカバーしません。そのため、ユーザーがを持たない場合、これら3つのことを実行する機能は問題になりません。ADMINISTER BULK OPERATIONS
ADMINISTER DATABASE BULK OPERATIONS
bulkadmin
ALTER TABLE
ALTER TABLE
何これまで議論されておらず、どのような最終的にはあるかもしれないセキュリティの問題は、両方のことですし、アクセス外部リソース、SQL Serverの外部に。Windowsログイン経由でSQL Serverにアクセスする場合、ファイルシステムアクセスを実行するために、Windowsアカウントが偽装されます(セキュリティコンテキストをを使用して切り替えても)。つまり、読み取り権限が付与されているファイルのみを読み取ることができます。それについて何も悪いことはありません。BULK INSERT
OPENROWSET(BULK...
EXECUTE AS LOGIN='...'
ただし、 SQL Serverログイン経由でSQL Serverにアクセスする場合、外部アクセスはSQL Serverサービスアカウントのコンテキストで行われます。これは、このアクセス許可を持つユーザーが、他の方法では読み取ることができないファイルや、アクセスできないフォルダー内のファイルを読み取ることができることを意味します。
少なくとも、SQL ServerがSQL Server専用に作成されたアカウントとして実行されるように設定されている場合(推奨される方法)、そのようなユーザーは「SQL Server」アカウントがアクセスできるファイルのみを読み取ることができます。これは限られた問題ですが、SQL Serverログファイルなどのファイルを読み取ることができます(次の例をテストしましたが、動作します)。
SELECT tmp.[Col1]
FROM OPENROWSET(BULK
N'C:\Program Files\Microsoft SQL Server\MSSQLxx.InstanceName\MSSQL\Log\ERRORLOG.1',
SINGLE_NCLOB) tmp([Col1]);
ほとんどの人はMSSQL \ Logフォルダーにアクセスできないため、これは既存のセキュリティ制限を回避する方法です。
また、SQL ServerがLocal System
アカウントとして実行されている場合、問題の範囲が拡大するだけで、このアクセス許可を持つユーザーは広範なシステム関連ファイルを読み取ることができると思われます。
そして、これが、バルクインポートを行う他の方法(BCPおよびSqlBulkCopy
-)がbulkadmin
許可/役割を必要としない理由である可能性があります。そのような場合、SQL Serverはファイルを読み取ることはなく(またはSQL Serverの外部に到達することもありません)、外部プロセスによって読み取られるファイルからインポートするデータを受信するだけです。
考えられる意味は別として、それは質問で言われました:
アプリケーションの利点として、バルク挿入ははるかに効率的で高速です。
OK
また、SQL以外のファイルを解析する必要性からプログラマを解放します。
おっとネリー。ここで止めましょう。T-SQLは通常、解析に最適な言語の選択肢ではありません。多くの場合、DBにデータを挿入する前に解析を行うのが最善です。これを行う1つの方法は、テーブル値パラメーター(TVP)を使用することです。前述のデータの効率的な一括インポートとともに、事前解析と検証のトピックを扱う別の質問(ここDBA.StackExchange)への私の回答を参照してください。
T-SQL:カスタム解析された数値データ、ルックアップ値を含むCSV-> tableパイプライン