我是SQL Server(Express)的新手,非常感谢愿意帮助新手的人。我有一个拆分Access数据库,我已将表迁移到SQL Server。我需要解决的最后一个问题是创建一个触发器,它将根据另一个表中的数据更新/更改来更新一个表中的数据行。有两个表我需要创建触发器,但是我假设一旦我得到一个权利,我只需要为第二个使用相同的逻辑。
它的要点是数据输入tblData
和tblFamily
,这些表中的某些列与Contacts
中的某些列相同(例如,名称,地址,城市,州,邮编...等)。
当在两个表中的一个或两个表中输入新数据,或者在两个表中的一个或两个表中更新数据,或者在两个表中的一个或两个表中删除数据时 - 我需要该数据在tblContacts
中是相同的。
我认为最好的方法是触发,但如果有更好的方法,我很乐意学习。
到目前为止,我已经有了这个触发器:
CREATE TRIGGER ContactsTrigger
ON [dbo].[tblData]
FOR UPDATE
AS
INSERT INTO dbo.Contacts (LastName, FirstName, MiddleName,
EmailAddress, HomePhone, MobilePhone,
Address, City, StateProvince, ZIPPostal,
id, ContactIDType)
SELECT
LastName, FirstName, MiddleName,
EmailAddress, HomePhone, MobilePhone,
Address, City, StateProvince, ZipPostal,
ID, ContactIDType
FROM
INSERTED
GO
这似乎适用于插入新记录,但当我更改tblData
中现有记录中的数据时,它只是在Contacts
中插入一条新记录,以便我有一个重复记录排序(旧值和新值)。我不需要这个 - 当Contacts
中的同一记录更改数据时,我需要更新tblData
表中的记录,同时还要继续插入根据输入的新记录或tblData
中删除的旧记录,新记录或删除记录。
我觉得非常愚蠢,因为我确定它一定是一个简单的解决方案,但我非常喜欢这个,并且愿意看起来很愚蠢以获得一些帮助或方向。 = d
答案 0 :(得分:1)
您需要根据输入的值决定是否更新或插入。然后,在你的触发器中,你必须有两个单独的语句 - 一个要插入(如你已经),一个要更新。
这样的事情:
CREATE TRIGGER ContactsTrigger
ON [dbo].[tblData]
FOR UPDATE
AS
IF ....... (you need to somehow decide whether to update or insert here) ......
BEGIN
INSERT INTO dbo.Contacts (LastName, FirstName, MiddleName,
EmailAddress, HomePhone, MobilePhone,
Address, City, StateProvince, ZIPPostal,
id, ContactIDType)
SELECT
LastName, FirstName, MiddleName,
EmailAddress, HomePhone, MobilePhone,
Address, City, StateProvince, ZipPostal,
ID, ContactIDType
FROM
INSERTED
END
ELSE BEGIN
UPDATE dbo.Contacts
SET LastName = i.LastName, FirstName = i.FirstName,
MiddleName = i.MiddleName, EmailAddress = i.EMailAddress,
HomePhone = i.HomePhone, MobilePhone = i.MobilePhone,
Address = i.Address, City = i.City,
StateProvince = i.StateProvince, ZipPostal = i.ZipPostal,
ContactIDType = i.ContactIDType
FROM
Inserted i
WHERE
-- define some condition that links the rows in the `Inserted` pseudo table
-- with the `Contacts` table - I just **guessed** it might be the `ID` column
ID = I.ID
END
GO
所以现在,你的工作是弄清楚你可以测试什么样的条件来知道行是否是新的,应该插入或更新。
ID
Contacts
值的事实
更新:如果您的列ID
是决定因素 - 请尝试以下操作:它首先更新dbo.Contacts
中已存在于表中的所有行,然后插入那些不属于dbo.Contacts
的人:
CREATE TRIGGER ContactsTrigger
ON [dbo].[tblData]
FOR UPDATE
AS
-- first update existing rows in dbo.Contacts with values from "Inserted"...
UPDATE dbo.Contacts
SET LastName = i.LastName, FirstName = i.FirstName,
MiddleName = i.MiddleName, EmailAddress = i.EMailAddress,
HomePhone = i.HomePhone, MobilePhone = i.MobilePhone,
Address = i.Address, City = i.City,
StateProvince = i.StateProvince, ZipPostal = i.ZipPostal,
ContactIDType = i.ContactIDType
FROM
Inserted i
WHERE
-- define some condition that links the rows in the `Inserted` pseudo table
-- with the `Contacts` table - I just **guessed** it might be the `ID` column
ID = I.ID
-- then secondly insert new rows into dbo.Contacts
INSERT INTO dbo.Contacts (LastName, FirstName, MiddleName,
EmailAddress, HomePhone, MobilePhone,
Address, City, StateProvince, ZIPPostal,
id, ContactIDType)
SELECT
LastName, FirstName, MiddleName,
EmailAddress, HomePhone, MobilePhone,
Address, City, StateProvince, ZipPostal,
ID, ContactIDType
FROM
INSERTED i
WHERE
i.ID NOT IN (SELECT ID FROM dbo.Contacts);
GO