9

データベース (具体的には SQL Server 2005) で継承を使用する方法はありますか?

すべてのエンティティに追加したいCreatedOnCreatedByのようなフィールドがほとんどないとします。これらのフィールドをすべてのテーブルに追加する代わりに、別の方法を探しています。

4

9 に答える 9

3

SQL Server 2005 にはテーブル間の継承のようなものはありません。他の人が指摘したように、テーブルを作成するときに必要な列をテーブルに追加するためのヘルプを得ることができますが、それは継承ではありません。それを知っている。

ソース コード ファイルのテンプレートのようなものと考えてください。

GateKiller が言及しているように、共有データを含むテーブルを作成し、それを外部キーで参照できますが、監査フックやトリガーを用意するか、手動で更新する必要があります。

結論:手作業。

于 2008-08-08T11:08:22.923 に答える
2

PostgreSQL にはこの機能があります。これをテーブル定義の最後に追加するだけです:

INHERITS FROM (tablename[, othertable...])

子テーブルにはその親のすべての列が含まれ、親テーブルを変更すると子も変更されます。また、子テーブルのすべてが、親テーブルへのクエリで表示されます (デフォルト)。残念ながら、インデックスは親子の境界を越えません。つまり、特定の列が親と子の両方で一意であることを確認できません。

私の知る限り、これはあまり頻繁に使用される機能ではありません。

于 2008-08-08T10:55:20.640 に答える
0

GUIDを使用している場合は、列がGUID、CreatedOn、CreatedByのCreateHistoryテーブルを作成できます。テーブルにデータを入力するには、テーブルごとにトリガーを作成するか、アプリケーションロジックで処理する必要があります。

于 2008-08-20T12:23:15.623 に答える
0

これを行うために継承を使用したくない!テーブルB、C、およびDがテーブルAから継承する場合、これは、テーブルAにクエリを実行すると、B、C、およびDからのレコードが得られることを意味します。

から削除;

継承の代わりに、代わりにLIKEを使用してください...

CREATE TABLE blah (
    blah_id     serial       PRIMARY KEY
    , something text         NOT NULL
    , LIKE template_table    INCLUDING DEFALUTS
);
于 2008-09-16T05:48:00.420 に答える
0

特定のテーブルに監査列を追加し、(オプションで) 履歴テーブルと関連するトリガーを作成して値の変更を追跡する SProc があります。残念ながら、会社のポリシーにより共有できませんが、実際に達成することは難しくありません。

于 2008-08-08T14:59:43.777 に答える
0

Management Studio のテンプレート ペインでテンプレートを作成できます。そして、新しいテーブルを作成するたびにそのテンプレートを使用します。

それができない場合は、元のテーブルと ID を参照する監査証跡テーブルに CreatedOn フィールドと CreatedBy フィールドを格納できます。

それができない場合は、手動で行います。

于 2008-08-08T10:43:41.913 に答える
0

ER/Studio や ERWin などのデータ モデリング ツールを使用できます。どちらのツールにも、任意のテーブルに適用できる列テンプレートを定義できるドメイン列があります。ドメインが変更されると、関連する列も変更されます。ER/Studio には、作成して任意のテーブルに適用できるトリガー テンプレートもあります。これは、何百ものトリガー スクリプトを作成して維持することなく、LastUpdatedBy 列と LastUpdatedDate 列を更新する方法です。

監査テーブルを作成すると、監査テーブルを使用するすべてのテーブルのすべての行に対して 1 つの行が作成されます。それは面倒になる可能性があります。私の意見では、すべてのテーブルに監査列を配置する方がよいでしょう。すべてのテーブルにタイムスタンプ列を配置することもできます。並行性がいつ問題になるかはわかりません。すべてのテーブルに配置する DB 監査列は、CreatedDt、LastUpdatedBy、LastUpdatedDt、および Timestamp です。

お役に立てれば。

于 2008-08-08T12:00:55.197 に答える
0

OR マッピングでは、親テーブルと子テーブルが同じ識別子を使用する親テーブルに継承がマップされます。

例えば

create table Object (
    Id int NOT NULL --primary key, auto-increment
    Name varchar(32)
)
create table SubObject (
    Id int NOT NULL  --primary key and also foreign key to Object
    Description varchar(32)
)

SubObject は Object に対して外部キー関係を持っています。サブオブジェクト行を作成するときは、最初にオブジェクト行を作成し、両方の行で Id を使用する必要があります

于 2008-09-17T19:48:13.870 に答える
0

Ramesh - I would implement this using supertype and subtype relationships in my E-R model. There are a few different physical options you have of implementing the relationships as well.

于 2008-09-17T19:25:58.477 に答える