1

テーブルスコープで同じ結果を達成したい場合、デフォルトとしてマークされた1つのレコードのみの制約に基づいて、ビューと一意のクラスター化インデックスの同じアプローチが適用されますか?

Accounts というテーブルがあります。システム アカウントは 1 つしか存在できませんが、パートナー アカウントとクライアント アカウントは多数存在できます。アカウントの各タイプは、列に関しては異なりませんが、代わりにタイプ列だけが異なります。

ID | Type    | Name 
1    System    Contoso
2    Partner   Wingtip
3    Partner   Northwind
4    Client    Adventure Works
5    Client    Fabrikam

上記では、別のシステム アカウントを追加できないようにしたいのですが、多くのパートナー アカウントとクライアント アカウントを許可します。ドメインではなくデータベースに属する懸念のように感じます (おそらく私は間違っています)?

4

1 に答える 1

3

システム アカウントの ID 番号が常に 1 であることがわかっている場合は、CHECK 制約を使用してこれを実装できます。これらの線に沿った何か。. .

create table accounts (
  id integer primary key,
  type varchar(15) not null,
  name varchar(15) not null,
  unique (type, name),
  check (
    (id = 1 and type = 'System') or
    (id <> 1 and type <> 'System')
  )
);

実際、これがデータベースの場合、システム アカウントは任意の ID 番号を持つことができますCHECK() 制約を一致するように変更するだけです。

クライアント サイトへの展開用に構築している場合は、展開前にシステム アカウントを追加できます。(そして、制約をどのように処理するかに関係なく、おそらくそうするべきです。)

ユーザーがこのテーブルから行を削除しようとしたときに何をすべきかを考えてみてください。(特にそのシステム アカウントの行。)次に、データベース管理者がそのテーブルから行を削除しようとしたときに何をすべきかを考えてください。

外部キー制約 (カスケードなし) またはトリガーを使用して、データベース管理者が誤ってシステム アカウントを削除するのを防ぐことができます。管理者はおそらくこれらの制限を回避できますが、行を削除するためにそこまで行くつもりがある場合は、管理者が何をしているのかを知っていることを願っています.

于 2012-04-09T14:04:39.140 に答える