0

下の画像に示すように、3つの関連するテーブルがあります。

Db図

全員がUserテーブルとUserRoleにエントリを持っています。一部のユーザーはサブスクライバーです。

サブスクライバーテーブルを制約して、ロールがIsSusbcriberであるユーザーのみを含めることができ、UserRoleをユーザーレベルで保持できるようにします。出来ますか?

テーブル間の現在の関係を失礼します。それらは、必然的に必要なものではなく、現時点でそこにあるものを表しています。

4

3 に答える 3

1

列を削除して、以前に列を設定したロールを正確に含むテーブルをIsSubscriber追加できると思います。UserSubscriberRolesIsSubscriber

CREATE UserSubscriberRoles
  ( UserRoleId PRIMARY KEY
  , FOREIGN KEY (UserRoleId)
      REFERENCES UserRoles (UserRoleId) 
  ) ;

次に、Subscribersテーブル内のFKを次のように変更します。

   FOREIGN KEY (UserId, UserRoleId)
     REFERENCES User (UserId, UserRoleId) 
   FOREIGN KEY (UserRoleId)
     REFERENCES UserSubscriberRoles (UserRoleId) 
于 2012-08-08T18:07:27.733 に答える
0

出来ますか?

理論的には、そうです。SQLアサーションを使用できます。例については、このStackOverflowの回答を参照してください。

ただし、実際には、主要なDBMSはSQLアサーションをサポートしておらず、説明する内容を外部キー制約として実装することはできないため、この制約を評価し、満たされない場合は例外を発生させるトリガーを作成するしかないと思います。。

于 2012-08-08T17:47:55.897 に答える
0

テーブルにRoleIdがない場合にこれを制限する唯一の方法は、トリガー(通常、トリガーは設計上の選択としては不適切です)、または基準に合わないユーザーをサブスクライバーから定期的に削除するSQLエージェントジョブを使用することです。

サブスクライバーのRoleIDを使用すると、特定の値に制限するチェック制約を追加できます。

これは、別の設計やアプリケーションコードで実際に実施する方が適切です。

于 2012-08-08T17:49:42.957 に答える