2017-09-26 53 views
2

我有兩種形式,即frmSupplierfrmCustomer,允許用戶添加和更新客戶和供應商信息。目前我們在SQL Server數據庫中有兩個表,分別爲CustomerSupplier。我們將這兩個表格遷移到一個名爲Contact的表格中,並將CustomerSupplier表格轉換爲視圖。我們這樣做是因爲我們希望應用程序中的代碼不再被修改,因爲這需要時間。INSTEAD OF INSERT中的列的設置值

我研究並發現了INSTEAD OF INSERT觸發器。

這是SQL:爲客戶

CREATE TABLE [dbo].[Contact] 
(
    [ContactID] [int] IDENTITY(1,1) NOT NULL, 
    [Code] [varchar](20) NULL, 
    [ContactName] [varchar](52) NULL, 
    [Active] [bit] NULL, 
    [Customer] [bit] NULL, 
    [Supplier] [bit] NULL, 
    [DeliveryAddr1] [varchar](255) NULL, 
    [DeliveryAddr2] [varchar](75) NULL, 
    [DeliveryAddr3] [varchar](75) NULL, 
    [DeliveryAddr4] [varchar](75) NULL, 
    [CreateDate] [datetime] NULL, 
    [LastUpdated] [datetime] NULL, 
    [TempID] [int] NULL, 

    CONSTRAINT [PK_Contact] 
     PRIMARY KEY CLUSTERED ([ContactID] ASC) 
) ON [PRIMARY] 
GO 

創建視圖:

CREATE VIEW [dbo].[Customer] 
AS 
    SELECT   
     ContactID AS CustID, Code AS CustCode, 
     ContactName AS CustName, Active, Customer, 
     DeliveryAddr1, DeliveryAddr2, DeliveryAddr3, DeliveryAddr4, 
     CreateDate, LastUpdated 
    FROM    
     dbo.Contact 
    WHERE   
     (Customer = 1) 
GO 

查看供應商:

CREATE VIEW [dbo].[Supplier] 
AS 
    SELECT   
     ContactID AS SuppID, Code AS SuppCode, 
     ContactName AS SuppName, Active, 
     DeliveryAddr1, DeliveryAddr2, DeliveryAddr3, DeliveryAddr4, 
     CreateDate, LastUpdated 
    FROM    
     dbo.Contact 
    WHERE   
     (Supplier = 1) 

我想,當插入一個供應商,它會將其插入到Contact並設置爲Supplier=1,或者如果插入了客戶,它將設置Customer=1

這是我的觸發器:

CREATE TRIGGER trgNewCust 
ON dbo.Contact 
INSTEAD OF INSERT 
AS 
BEGIN 
    INSERT INTO Customer 
     SELECT 
      [CustCode], [CustName], [Active], 
      [DeliveryAddr1], [DeliveryAddr2], [DeliveryAddr3], [DeliveryAddr4] 
     FROM 
      inserted 
END 

我會在哪裏設置Customer=1Supplier=1?另一個問題是,我如何知道Contact中新插入的物品是供應商還是客戶?

將值插入C#應用程序中,使用INSERT INTO Customer...作爲客戶,INSERT INTO Supplier...作爲供應商。

+1

將客戶和供應商合併成一張表是一個壞的舉動,你會後悔的。雖然他們可能有一些共同的屬性,但他們是不同的實體,與組織有着不同的關係,並且他們將具有許多完全不同的屬性......僅僅是我的2美分。 –

回答

2

您需要讓您的INSTEAD OF INSERT觸發在VIEWS - 而不是Contact表!

CREATE TRIGGER trgNewCust 
ON dbo.Customer  -- trigger must be on the VIEW - not the underlying table! 
INSTEAD OF INSERT 
AS 
BEGIN 
    -- *ALWAYS* explicitly define the list of columns you're inserting into! 
    INSERT INTO Contact(Code, ContactName, Active, Customer, Supplier, 
         DeliveryAddr1, DeliveryAddr2, DeliveryAddr3, DeliveryAddr4) 
     SELECT 
      CustCode, CustName, Active, 1, 0, 
      DeliveryAddr1, DeliveryAddr2, DeliveryAddr3, DeliveryAddr4 
     FROM 
      inserted 
END 

所以在這裏,在對Customer看你的觸發器,可以設置Customer=1, Supplier=0 - 應用相同的觸發邏輯來Supplier視圖,插入數據到Contact表中,設置Customer=0, Supplier=1

現在,從您的代碼,如果您在Customers視圖中「插入」某項內容,則會創建dbo.Contact表中的一行,並且在「插入」到視圖中時會發生同樣的情況。

+0

非常感謝,它的工作。 – Zhyke

相關問題