SQL Server触发器根据另一个表

时间:2017-11-19 05:42:33

标签: sql-server triggers insert

我是SQL Server(Express)的新手,非常感谢愿意帮助新手的人。我有一个拆分Access数据库,我已将表迁移到SQL Server。我需要解决的最后一个问题是创建一个触发器,它将根据另一个表中的数据更新/更改来更新一个表中的数据行。有两个表我需要创建触发器,但是我假设一旦我得到一个权利,我只需要为第二个使用相同的逻辑。

它的要点是数据输入tblDatatblFamily,这些表中的某些列与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

1 个答案:

答案 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