【发布时间】:2017-09-26 04:41:35
【问题描述】:
我有两个表单,即frmSupplier 和frmCustomer,允许用户添加和更新客户和供应商信息。目前,我们在 SQL Server 数据库中有两个表,分别用于 Customer 和 Supplier。我们将这两个表迁移到一个名为Contact 的表中,并将Customer 和Supplier 表转换为视图。我们这样做是因为我们希望我们的应用程序中的代码不再被修改,因为这需要时间。
我确实研究并发现了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...。
【问题讨论】:
-
将客户和供应商合并到一个表中是一个糟糕的举动,您会后悔的。虽然它们可能有一些共同的属性,但它们是不同的实体,与您的组织具有不同的关系,并且它们将具有许多完全不同的属性......只要我的 2 美分。
标签: c# sql-server triggers