4

複数のクライアントのデータを格納するために、単一のSQLServerデータベースを使用することを検討しています。すべてのデータを1つのデータベースに含めることで、「クライアントごとに個別のデータベース」を設定するよりも管理しやすくなると考えています。

私たちが抱えている最大の懸念は、間違ったクライアントへの偶発的なアクセスです。あるクライアントのデータを別のクライアントに誤って表示した場合、それは非常に悪いことです。私たちは多くのクエリを実行し、誰かが「これとこれのクエリを書いて、15分以内に会議のクライアントに見せに行く」と言うシナリオを恐れています。誰かが不注意WHEREで、正しいクライアントをフィルタリングする句を省略した場合、深刻な問題が発生します。単一の「グローバル」データベースから誤って間違ったクライアントのデータをプルすることを不可能にする(または少なくとも非常に困難にする)ような、SQL Serverの堅牢なセットアップまたはデザインパターンはありますか?

明確にするために、これはクライアントが直接またはアプリを介して(まだ)使用するデータベースではありません。私たちは何人かのプログラマーがアクセスするデータベースについて話しているので、自分自身を台無しにすることを恐れています。

4

4 に答える 4

2

少なくとも、クライアントデータを別々のスキーマに配置する必要があります。SQL Serverでは、スキーマは承認の単位です。特定のクライアントに対して許可された人だけが、そのクライアントのデータを見ることができるはずです。他の保護に加えて、データベースに組み込まれている認証機能を使用する必要があります。

現在、ごく少数の人々がすべてのデータにアクセスしている状況にあるようです。さて、あなたが成功した場合、あなたはおそらく将来もっと多くの人々を必要とするでしょう。実際、一部のクライアントにデータへの直接アクセスを許可している可能性があります。それが彼らのデータである場合、彼らはその上でアプリを実行したいと思うでしょう。

成長を計画している場合の私の最善のアドバイスは、各クライアントのデータを別々のデータベースに配置することです。このデータベースをリモートサーバー上に配置できるように、システムを設計します。共通データと同期する必要がある場合は、そのデータを移動するためのレプリケーション戦略を開発します。

あるクライアントに別のクライアントのデータを表示させるのは悪いことだと思うかもしれませんビジネスの観点からは、これは致命的です-「会社が廃業し、仕事がない」のように致命的です。あなたのクライアントはおそらくあなたよりもそのような守秘義務についてもっと心配しています。そして、保護を保証するアーキテクチャは、それらをより快適にします。

于 2012-08-09T19:00:48.203 に答える
1

必要なパラメーターを受け取り、@customerIDその特定のテーブルをこの顧客のデータにフィルター処理する、テーブルごとに1つのインラインテーブル値関数を設定できます。アプリ全体がこれらのTVPのみを使用する場合、アプリは構造上安全です。

パフォーマンスに影響がある可能性があります。正確な数は、スキーマとクエリによって異なります。ただし、インラインTVPはインライン化され、クエリの残りの部分と一緒に最適化されるため、ゼロにすることができます。

于 2012-08-09T18:51:30.433 に答える
1

マルチテナントデータアーキテクチャ http://msdn.microsoft.com/en-us/library/aa479086.aspx

これが私たちがしていることです(残念ながらmysql):

  1. 各テーブルの「テナント」列
  2. テーブルは1つのスキーマにあります[1]
  3. ビューは別のスキーマにあります(セキュリティと命名を容易にするため)。ビューにテナント列を含めることはできません。ビューは、現在のユーザーに基づいてテナントに対してWHEREを実行します
  4. テナント値は、ユーザーに基づいて、挿入時にトリガーによって設定されます

すべてのDDLがソース管理下の.sqlファイルにあると仮定すると(そうあるべきです)、多くのデータベースまたはスキーマを持つことはそれほど難しくありません。

[1]mysqlのスキーマは「データベース」と呼ばれます

于 2012-08-09T19:25:26.860 に答える
0

データへのアクセスは、必須のcustomeridパラメーターを持つstoredproceduresを介してのみ制限できます。遅かれ早かれITビルドビューを許可すると、誰かがあなたが言ったようにこのwhere句を忘れてしまいます。しかし、すでに事前にフィルタリングされたビューを持つクライアントごとのスキーマは、セルフサービスと追加のBrings値を有効にします。

于 2020-08-30T14:06:11.397 に答える