2017-09-26 208 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

相关问题