【问题标题】:Set value of a column in INSTEAD OF INSERT在 INSTEAD OF INSERT 中设置列​​的值
【发布时间】:2017-09-26 04:41:35
【问题描述】:

我有两个表单,即frmSupplierfrmCustomer,允许用户添加和更新客户和供应商信息。目前,我们在 SQL Server 数据库中有两个表,分别用于 CustomerSupplier。我们将这两个表迁移到一个名为Contact 的表中,并将CustomerSupplier 表转换为视图。我们这样做是因为我们希望我们的应用程序中的代码不再被修改,因为这需要时间。

我确实研究并发现了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...

【问题讨论】:

  • 将客户和供应商合并到一个表中是一个糟糕的举动,您会后悔的。虽然它们可能有一些共同的属性,但它们是不同的实体,与您的组织具有不同的关系,并且它们将具有许多完全不同的属性......只要我的 2 美分。

标签: c# sql-server triggers


【解决方案1】:

您需要将INSTEAD OF INSERT 触发器放在视图上 - 而不是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 表中创建一行,当您“插入”到Supplier 视图中时也会发生同样的情况。

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多