12

アプリケーションのユーザーをSQLサーバーのユーザーとして実装しないため、アプリケーションサーバーがデータベースに接続するとき、各アプリケーションは常に同じクレデンシャルを使用して各データベースに接続します。

これには監査の問題があります。トリガーを使用して、すべての更新を保存し、挿入と削除を行い、それぞれを特定のユーザーに関連付けます。考えられる解決策の1つは、「ユーザーによって更新」列をすべてのテーブルに追加し、これを毎回更新することです。これは、すべてのテーブルに新しい列があり、すべてのストアドプロシージャに新しいパラメータがあることを意味します。また、ソフト削除しか実行できないことも意味します。

これの代わりに、接続文字列のApplication Nameプロパティを使用し、トリガー内のApp_Name()プロパティでこれを読み取ることを提案します。簡単なアプリでこれをテストしましたが、機能しているようです(形式は、App = MyApp | User = 100のようになります)。

皆さんへの質問は、これは悪い考えですか、そしてあなたはより良い考えを持っていますか?

4

3 に答える 3

10

これにはSET CONTEXT_INFOを使用します。それはまさにあなたが必要とするものです。

于 2008-11-27T14:27:11.563 に答える
2

アプリケーションが読み込まれるたびにユーザー名を接続文字列に挿入する必要がありますが、これは確かに実行可能なソリューションのようです。接続文字列が毎回異なるため、このソリューションはおそらく Web アプリケーションでは機能しないことに注意してください。これにより、接続プールの問題が大きくなる可能性があります。

もう 1 つのオプションは、ホスト名/IP アドレスを取得し (SELECT host_name() )、代わりにそれを保存することです。

App_Name/Hostname を自動的に挿入するように各ストアド プロシージャ (またはトリガー) を変更できるため、必ずしも各ストアド プロシージャに新しいパラメーターを必要とするわけではありません。

潜在的な欠点は、Management Studio を介して実行された変更にはカスタム App_Name がなく、ユーザーとして "Microsoft Management Studio" が残ることです。

于 2008-11-27T12:49:50.450 に答える
1

Application Nameプロパティを使用して監査トリガーを制御し、それを使用しても問題は発生しておらず、速度の問題にも気づいていません(ただし、この場合、特定のアプリケーションの監査を行っていないため、どの程度の量を測定するのは困難です。何かをしない時間はかかります:))

于 2008-11-27T11:17:33.507 に答える