INSTEAD OF INSERT中的列的设置值
我有两种形式,即frmSupplier
和frmCustomer
,允许用户添加和更新客户和供应商信息。目前我们在SQL Server数据库中有两个表,分别为Customer
和Supplier
。我们将这两个表格迁移到一个名为Contact
的表格中,并将Customer
和Supplier
表格转换为视图。我们这样做是因为我们希望应用程序中的代码不再被修改,因为这需要时间。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=1
或Supplier=1
?另一个问题是,我如何知道Contact
中新插入的物品是供应商还是客户?
将值插入C#应用程序中,使用INSERT INTO Customer...
作为客户,INSERT INTO Supplier...
作为供应商。
您需要让您的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
表中的一行,并且在“插入”到视图中时会发生同样的情况。
非常感谢,它的工作。 – Zhyke
将客户和供应商合并成一张表是一个坏的举动,你会后悔的。虽然他们可能有一些共同的属性,但他们是不同的实体,与组织有着不同的关系,并且他们将具有许多完全不同的属性......仅仅是我的2美分。 –