2014-07-03 17 views
0


我有以下3個表,我試圖讓模式更改爲[Check] .FromCompanyID,[Check] .ToCompanyID和[ ActivityToCheck] .ActivityID。除了將兩個FromCompanyID和ToCompanyID添加到[ActivityToCheck]表中,我怎麼能修改到模式,以便我可以在其中一個表上添加唯一約束?MSSQL模式更改以說明跨兩個表的唯一性

CREATE TABLE [dbo].[Activity](
    [ActivityID] [int] IDENTITY(1,1) NOT NULL, 
    [UserID] [int] NOT NULL, 
    [StartDate] [date] NOT NULL, 
    [EndDate] [date] NOT NULL, 
    [Description] [nvarchar](255) NULL 
    --<OTHER COLUMNS> 
) 

CREATE TABLE [dbo].[Check](
    [CheckID] [int] IDENTITY(1,1) NOT NULL, 
    [CheckNumber] [nvarchar](255) NOT NULL, 
    [CheckDate] [date] NOT NULL, 
    [CheckDescription] [nvarchar](255) NULL, 
    [FromCompanyID] [int] NOT NULL, 
    [ToCompanyID] [int] NOT NULL 
    --<OTHER COLUMNS> 
) 

CREATE TABLE [dbo].[ActivityToCheck](
    [ActivityToCheckID] [int] IDENTITY(1,1) NOT NULL, 
    [ActivityID] [int] NOT NULL, 
    [CheckID] [int] NOT NULL 
) 

編輯:將一個綁定到架構視圖是確保唯一合理的方式:

CREATE VIEW TestView 
WITH SCHEMABINDING AS 
SELECT ActivityToCheckID, CheckNumber, CheckID, FromCompanyID, ToCompanyID, ActivityID, AmountPaid 
FROM [dbo].[Check] c 
inner join [dbo].ActivityToCheck a on c.CheckID = a.CheckID 
GO 

CREATE UNIQUE CLUSTERED INDEX testindex on TestView (FromCompanyID, ToCompanyID, ActivityID) 
GO 

感謝,

+0

如果我理解正確,您希望'ActivityToCheck'對於每個「CheckID」是唯一的,那是正確的嗎? – 3dd

+0

對不起,ActivityToCheck需要在FromCompanyID,ToCompanyID和ActivityID之間唯一,基本上我試圖避免的是FromCompany的兩個人將相同的ActivityID添加到ToCompany的幾個不同的檢查中。 – user3800174

回答

0

您必須使用以下觸發dbo.Check表:

CREATE TRIGGER YourTriggerName ON dbo.[check] 
INSTEAD OF INSERT 
AS BEGIN 
    IF EXISTS(SELECT * 
       FROM Inserted i 
       INNER JOIN dbo.ActivityToCheck a1 ON i.CheckId = a1.CheckId 
       INNER JOIN dbo.ActivityToCheck a2 ON a2.ActivityId = a1.ActivityId 
       INNER JOIN dbo.[CHECK] c ON c.CheckId = a2.CheckId AND c.FromCompanyId=i.FromCompanyId AND c.ToCompanyId=i.ToCompanyId) BEGIN 
      RAISERROR('Your information is duplicate.',16,1) 
      RETURN; 
    End 

    INSERT INTO dbo.[check] (CheckNumber, CheckDate, CheckDescription, FROMCompanyId, ToCompanyId) 
    SELECT CheckNumber, CheckDate, CheckDescription, FROMCompanyId, ToCompanyId 
    FROM Inserted 

END 

還必須創建而不是更新觸發器dbo.Check表,如果FromCompanyId或ToCompanyId可編輯且可以更改。

+0

這些表可能會變得非常大,我希望每次插入記錄時都遠離多次連接。 – user3800174

+0

在表上插入記錄的觸發效果以及與您的表上的插入事務量有關。並且與表中的記錄數量無關。 –