2016-12-15 4 views
0

.NETとSQL ServerにはMVC4プロジェクトがあります。ユーザーを非アクティブにすることができるリストから右のユーザーのリストを表示しているか、または編集をクリックして、非アクティブフラグ以外のすべてのフィールドを表示します(リストにフラグを表示します)。ソフト削除時の再利用性へのアプローチ

私の同僚は、ユーザーのアクティブフラグを変更するためのストアドプロシージャを作成しました。純粋にオブジェクト指向の観点からは正しくありません。

我々は、pは人のインスタンス中である

PersonBusiness.Save(p) 

この

のように、我々は移入Person_SIDと人と呼ばれるクラス、名前、アクティブ、作成または編集するときに、我々はビジネス層に渡しています。私たちは同じ働きをして、ユーザーを活性化または不活性化してはいけませんか?代わりに、特に私たちは今、2つのストアドプロシージャを維持するなど冗長であることを引き起こして、これを行うために、ストアドプロシージャを呼び出すメソッドを持つの

public void SetFlag(int person_sid, bool flag) 
{ 
    Person p = null; 
    if((p = Get(person_sid)) != null)//check if user still exists 
    { 
     p.Active = flag; 
     Save(p); 
    } 
} 

repo.SetActive(person_sid, flag); 

はお時間をいただき、ありがとうございます。

答えて

1

あなたのような一連のタスクに2つ以上のストアドプロシージャを使用することは、完全に実行可能なアプローチであり、開発者の視点はここでは無関係です。ここで重要なのはビジネス要件だけであり、開発者が準最適と考える多くの決定を正当化することができます。

一般的な編集と比較して、Personを有効化(無効化)するユーザーに対して追加の(別の)権限を要求することがあります。こうした、しかし

if is_rolemember('supervisor') = 0 and @Active != @OldActive 
    throw 'Membership in the "supervisor" role is required to deactivate a person.'; 

create role 'manager'; 
go 
create role 'supervisor'; 
go 
grant execute on dbo.person_Edit to [manager]; 
go 
grant execute on dbo.person_Activate to [supervisor]; 
go 

確かに、あなたのような、あなたのコード内で同等のチェックを追加することができます。通常、私は次のように、別のロールを作成し、それらに対応するオブジェクトへのアクセス権を付与しますソリューションには他にも多くの問題があります。チェックはコード内にあるので、組み込みSQL Serverセキュリティシステムを使用して権限を設定することはできません。後でビジネス・ルールが変更される場合、DBAは単にプロシージャのコードを変更する必要があるだけでアクセス権を調整することはできません。なんらかの理由で、そのような要件がデータベース・インスタンスによって異なる場合は...まあ、あなたはそのアイデアを持っています。

要するに、このようなアクセスの分離などが必要かどうか、そうでない場合は追加手続きを取り除くための引数として使用してください。それ以外の場合は、既存のソリューションを変更しない方が良いでしょう。

+0

ありがとうございます。 – Alex

関連する問題