2017-05-23 22 views
2

私はMySQLを使用しています。倍数テーブルの値にSQL制約を追加する方法

I以下の表にしている

User(UserID, UserTypeID, AccountID) 
Account(AccountID, AccountTypeID) 
Permission(PermissionID) 
UserType(UserTypeID) 
AccountType(AccountTypeID) 
UserPermission(UserID, PermissionID) 
PermissionRule(UserTypeID, AccountTypeID, PermissionID) 

それはSQLの制約を以下に制限することは可能ですか? UserPermissionテーブルにアクセス許可を挿入すると、そのユーザーのUserTypeIDとそのユーザーのアカウントのAccountTypeIDPermissionIDが挿入されたテーブルがPermissionRuleテーブルに存在する必要があります。

このような感じは、ビジネスルールやプロシージャー/トリガーの方がはるかに多いかもしれませんが、私が気づいていないSQL制約を使用して制限する方法があるのだろうかと思います。

私はHibernateでSpringデータを使用しています。だから、春や冬眠のアノテーションベースの制限も役に立ちます。

+0

プライマリ/外部キー制約は、部分的に、あなたが望む行動になるだろう。このロジックをアプリケーション層から処理できますか? –

+0

私は間違いなくアプリケーション層でこれを行うことができます。しかし、とにかくSQLからできることがあるのだろうかと思っています。特に、PermissionRuleで行を削除すると、UserPermissionから該当するエントリが削除されるのが好きです。私はそのような場合に手続きやトリガーを書かなければならないかもしれないと思います... – TechCrunch

答えて

2

オラクルであった場合、答えは "Check Constraints"です。

MySQL doesn't supportチェック制約。

CHECK句は解析されますが、すべてのストレージエンジンで無視されます。 1.8.2.3項「外部キーの相違点」を参照してください。

0

制約をどのように動作させるかによって、外部キー制約とマテリアライズド・ビューの可能な助けを借りて行うことができます。

私は何ヨーヨーが望むことであることを、今のところ想定していますUserTypeID, AccountTypeID, PermissionID)(の3組はPermissionRuleテーブルに存在しなければならない3つのタプルがで一意である場合はすべてのフィールドがUserPermission

に存在しています。 PermissionRuleあなただけの外部キー制約を作成することができます。あなたはSELECT DISTINCT UserTypeID, AccountTypeID, PermissionID FROM PermissionRuleに基づいてマテリアライズド・ビューを作成し、一意制約からそのテーブルを参照することができない場合。

を3つのフィールドがする場合は、制約をUserPermissionには存在しないが、必要があります他の表から参照する場合は、マテリアライズド・ビューを作成して必要な結合を実行し、その上にForeign Keyを置く。

MySQLはマテリアライズドビューを実際にサポートしていませんが、トリガと通常の表を使用して手動で作成できます。この記事で説明したように

http://www.fromdual.com/mysql-materialized-views

関連する問題