2016-04-28 51 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

试一试会回答这个问题,但嘿。是。这是一个循环依赖。您可能必须在创建后添加其中一个约束来解决此问题。尽管我质疑这是否有意义。一个'OversightResult'只有一个'AuditReport'吗?如果是的话,为什么不把它们放在同一张桌子上呢?如果否,那么预想的链接是不可能的。另外我猜'OR_Recommdations'是一个错字。 –

+0

您可以尝试将它们创建为临时表(在名称前加一个#),这样您将看到任何错误而无需实际制作表。请记住,您需要在最后删除表格,否则下次您将重新创建相同的表格。 –

回答

0

如果这真的是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 

,它不应该太难使这是一个索引视图如果需要的话要么...

否则,您需要从两个表中的一个表中删除FK,并在保留它的FK上添加一个UNIQUE索引(可能使其成为PK的一部分?)。但是把它全部放在一张桌子上就不那么令人困惑了。

0

这是循环依赖。表AuditReportOversightResults有关系,反之亦然。最好避免这种情况,可以将它合并为一个表,或者如果需要,可以创建另一个映射表。 如果您特别要求此循环依赖关系,则可以按照以下步骤操作。

  1. 创建表AuditReportOversightResults没有FK关系。
  2. 然后创建OversightResults并涉及AuditReport
  3. 修改表AuditReport并将FK关系添加到 OversightResults