2016-04-28 10 views
-1

カスタマーリクエストごとにいくつか作成していますが、私はステートメントを持っており、失敗するかどうか、または失敗しないようにコード行を追加する必要があるかどうかは疑問です。テーブル作成ステートメント

CREATE TABLE AuditReport 
(
    AR_ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, 
    TPPRM_ID NVARCHAR(8) NOT NULL FOREIGN KEY REFERENCES Vendor(TPPRM_ID) ON DELETE CASCADE ON UPDATE CASCADE, 
    OR_ID INT NOT NULL FOREIGN KEY REFERENCES OversightResults(OR_ID) ON DELETE CASCADE ON UPDATE CASCADE, 
    AR_ReportNAme NVARCHAR(20) NOT NULL, 
    AR_Version NVARCHAR(7), 
    AR_Type NVARCHAR(20), 
    AR_DateCoveragePeriod DATETIME2, 
    AR_DateReceived DATETIME2, 
    AR_Opinion NVARCHAR(11) CONSTRAINT CHK_Opinion CHECK (AR_Opinion IN ('Qualified','Unqualified')), 
    AR_NextReportDate DATETIME2, 
    AR_KeyContactName NVARCHAR(30), 
    AR_ContactEmail NVARCHAR(40), 
    AR_ContactPhoneNumber NVARCHAR(14) 
) 

--Create OversightResults Table 
CREATE TABLE OversightResults 
(
    OR_ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, 
    AR_ID INT NOT NULL FOREIGN KEY REFERENCES AuditReport(AR_ID) ON DELETE CASCADE ON UPDATE CASCADE, 
    TPPRM_ID NVARCHAR(8) NOT NULL FOREIGN KEY REFERENCES Vendor(TPPRM_ID) ON DELETE CASCADE ON UPDATE CASCADE, 
    OR_ServiceObjectives BIT, 
    OR_Objectives BIT, 
    OR_ControlsTested BIT, 
    OR_ManagementUserEntity NVARCHAR(10) CONSTRAINT CHK_ManagementUserEntity CHECK (OR_ManagementUserEntity IN ('Management','User')), 
    OR_Controls NVARCHAR(MAX), 
    OR_ServicerResponse NVARCHAR(MAX), 
    OR_ArvestMitigatingControls NVARCHAR(MAX), 
    OR_Deficiency NVARCHAR(10), 
    OR_Recommdations NVARCHAR(MAX), 
    OR_Observations NVARCHAR(MAX), 
    OR_Sufficiency BIT, 
    OR_RiskIdentified NVARCHAR(MAX) 
) 

あなたがテーブルで見ることができるように監査レポートのテーブルを設計は、外部キーとしてOR_IDたと監督の結果テーブルには主キーとしてそれを持っているし、監督の結果は、外部キーとしてAR_IDを持っており、監査報告書はそれを持っています主キーとして使用します。 OR_IDを主キーとする表がまだ作成されていないため、ステートメントが現状のままであるため、監査レポート表の作成に失敗しますか?

+0

クエリの実行結果を入力してください。 – piyushj

+0

これを試してみてください。はい。これは循環依存です。これを回避するには、作成後に制約の1つを追加する必要があります。私はそれが何か意味があるかどうか質問しますが。 1つの 'OversightResult'に対して' AuditReport'が1つしか存在しませんか?はいの場合、両方を同じテーブルに置くのはなぜですか?もしそうでなければ、想定されたリンクは両方向では不可能である。また、 'OR_Recommdations'はタイプミスです。 –

+0

テンポラリテーブル(名前の前に#を付ける)として作成すると、テーブルを実際に作成しなくてもエラーが表示されます。最後にテーブルを削除する必要がある場合は、次回同じテーブルを再作成する際にエラーが発生することに注意してください。 –

答えて

0

これが本当に1:1の関係にある場合は、すべてを1つのテーブルに入れてください。 ...

CREATE VIEW vw_OversightResults AS 
WITH SCHEMABINDING 
SELECT 
    OR_ID, 
    TPPRM_ID, 
    OR_ServiceObjectives, 
    OR_Objectives, 
    OR_ControlsTested, 
    OR_ManagementUserEntity, 
    OR_Controls, 
    OR_ServicerResponse, 
    OR_ArvestMitigatingControls, 
    OR_Deficiency, 
    OR_Recommdations, 
    OR_Observations, 
    OR_Sufficiency, 
    OR_RiskIdentified 
FROM AuditReport 

そして、どちらか、必要であれば、このインデックス付きビューを作成するには余りにも難しいことではありません:あなたがしたい場合は、その後、その結果、例えばを分離するために、そのテーブルの上にいくつかのビューを作成することができます

それ以外の場合は、2つのテーブルのいずれかからFKを削除し、それを保持するFKにUNIQUEインデックスを追加する必要があります(おそらくそれをPKの一部にしますか?)。しかし、それを1つのテーブルにまとめておくのは紛らわしいことではありません。

0

これは循環依存です。表AuditReportOversightResultsとの関係があり、逆も同様である。これを回避する方が良い場合は、これを単一のテーブルとしてマージするか、必要に応じてさらに1つのマッピングテーブルを作成することができます。 この循環依存関係が特に必要な場合は、手順に従います。

  1. テーブルAuditReportを作成し、OversightResultsとのFK関係はありません。
  2. 次に、OversightResultsを作成し、AuditReportに関連してください。
  3. テーブルAuditReportを変更し、 OversightResultsにFKの関係を追加します。
関連する問題