SQL Server 2008从多个表更新/插入/删除的触发器

SQL Server 2008从多个表更新/插入/删除的触发器,sql,sql-server-2008,triggers,Sql,Sql Server 2008,Triggers,我有一个表UserInfoComputed,它的数据来自UserInfo,UserInfoComputed也有对UserCompany的外键约束 我在UserInfo上有一个触发器,它在UserInfoComputed中插入/更新/删除行 这是我的UserInfoComputed表格: CREATE TABLE [dbo].[UserInfoComputed ]( [id] AS (CONVERT([bigint],replace([law_id],'LAW',''),

我有一个表
UserInfoComputed
,它的数据来自
UserInfo
UserInfoComputed
也有对
UserCompany
的外键约束

我在
UserInfo
上有一个触发器,它在
UserInfoComputed
中插入/更新/删除行

这是我的
UserInfoComputed
表格:

    CREATE TABLE [dbo].[UserInfoComputed ](
        [id]  AS (CONVERT([bigint],replace([law_id],'LAW',''),(0))) PERSISTED NOT NULL,
        [company_id] [varchar](12) NOT NULL,
        [first_name] [varchar](30) NOT NULL,
        [last_name] [varchar](30) NOT NULL,
        [law_id] [varchar](12) NOT NULL,
        [type] [smallint] NULL,
        [dtype]  AS (case [TYPE] when (1) then 'Corporate' else 'Non-Corporate' end)        PERSISTED NOT NULL,
     CONSTRAINT [PK_UserInfoComputed] PRIMARY KEY CLUSTERED 
    (
    [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,       ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
    ALTER TABLE [dbo].[UserInfoComputed]  WITH CHECK ADD  CONSTRAINT    [FK668581C04AA07B12]     FOREIGN KEY([company_id])
    REFERENCES [dbo].[UserCompany] ([id])
    GO
这是我的
UserInfo
表格

  CREATE TABLE [dbo].[UserInfo](
    [ID] [varchar](12) NOT NULL,
    [CompanyID] [varchar](12) NULL,
    [Status] [char](4) NULL,
    [FirstName] [varchar](30) NOT NULL,
    [LastName] [varchar](30) NOT NULL,
     CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
     ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO
    CREATE TABLE [dbo].[UserCompany](
        [ID] [varchar](12) NOT NULL,
        [Name] [varchar](100) NULL,
        [ShortName] [varchar](25) NULL,
        [Type] [smallint] NULL,
CONSTRAINT [PK_UserCompany] PRIMARY KEY NONCLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,      ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
CREATE TRIGGER [dbo].[ReconcileUserInfoComputed]
   ON [dbo].[UserInformation]
   AFTER INSERT,DELETE,UPDATE
AS 
IF @@ROWCOUNT = 0 -- exit trigger when zero records affected
BEGIN
    RETURN
END
IF EXISTS (SELECT * FROM INSERTED)
    BEGIN
    IF EXISTS (SELECT * FROM DELETED)
        BEGIN
            --UPDATE
            UPDATE [dbo].[UserInformationComputed]
            SET -- use new values from inserted 
            first_name = (SELECT FirstName FROM inserted),
            last_name = (SELECT LastName FROM inserted),
            law_id = (SELECT ID FROM inserted)
            WHERE law_id = (SELECT ID FROM deleted)
        END
        ELSE
        BEGIN
            --INSERT
            INSERT INTO [dbo].[UserInfoComputed] (first_name,last_name, law_id)
            SELECT FirstName, LastName, ID FROM inserted
        END
    END
    ELSE IF EXISTS(SELECT * FROM DELETED)
    BEGIN
        --DELETE
        DELETE FROM [dbo].[UserInfoComputed]
        WHERE law_id = (SELECT id FROM deleted)
    END 
GO
这是
UserCompany

  CREATE TABLE [dbo].[UserInfo](
    [ID] [varchar](12) NOT NULL,
    [CompanyID] [varchar](12) NULL,
    [Status] [char](4) NULL,
    [FirstName] [varchar](30) NOT NULL,
    [LastName] [varchar](30) NOT NULL,
     CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
     ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO
    CREATE TABLE [dbo].[UserCompany](
        [ID] [varchar](12) NOT NULL,
        [Name] [varchar](100) NULL,
        [ShortName] [varchar](25) NULL,
        [Type] [smallint] NULL,
CONSTRAINT [PK_UserCompany] PRIMARY KEY NONCLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,      ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
CREATE TRIGGER [dbo].[ReconcileUserInfoComputed]
   ON [dbo].[UserInformation]
   AFTER INSERT,DELETE,UPDATE
AS 
IF @@ROWCOUNT = 0 -- exit trigger when zero records affected
BEGIN
    RETURN
END
IF EXISTS (SELECT * FROM INSERTED)
    BEGIN
    IF EXISTS (SELECT * FROM DELETED)
        BEGIN
            --UPDATE
            UPDATE [dbo].[UserInformationComputed]
            SET -- use new values from inserted 
            first_name = (SELECT FirstName FROM inserted),
            last_name = (SELECT LastName FROM inserted),
            law_id = (SELECT ID FROM inserted)
            WHERE law_id = (SELECT ID FROM deleted)
        END
        ELSE
        BEGIN
            --INSERT
            INSERT INTO [dbo].[UserInfoComputed] (first_name,last_name, law_id)
            SELECT FirstName, LastName, ID FROM inserted
        END
    END
    ELSE IF EXISTS(SELECT * FROM DELETED)
    BEGIN
        --DELETE
        DELETE FROM [dbo].[UserInfoComputed]
        WHERE law_id = (SELECT id FROM deleted)
    END 
GO
类型值为1、2或3

这是我在
UserInfo
表上的触发器

  CREATE TABLE [dbo].[UserInfo](
    [ID] [varchar](12) NOT NULL,
    [CompanyID] [varchar](12) NULL,
    [Status] [char](4) NULL,
    [FirstName] [varchar](30) NOT NULL,
    [LastName] [varchar](30) NOT NULL,
     CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
     ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO
    CREATE TABLE [dbo].[UserCompany](
        [ID] [varchar](12) NOT NULL,
        [Name] [varchar](100) NULL,
        [ShortName] [varchar](25) NULL,
        [Type] [smallint] NULL,
CONSTRAINT [PK_UserCompany] PRIMARY KEY NONCLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,      ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
CREATE TRIGGER [dbo].[ReconcileUserInfoComputed]
   ON [dbo].[UserInformation]
   AFTER INSERT,DELETE,UPDATE
AS 
IF @@ROWCOUNT = 0 -- exit trigger when zero records affected
BEGIN
    RETURN
END
IF EXISTS (SELECT * FROM INSERTED)
    BEGIN
    IF EXISTS (SELECT * FROM DELETED)
        BEGIN
            --UPDATE
            UPDATE [dbo].[UserInformationComputed]
            SET -- use new values from inserted 
            first_name = (SELECT FirstName FROM inserted),
            last_name = (SELECT LastName FROM inserted),
            law_id = (SELECT ID FROM inserted)
            WHERE law_id = (SELECT ID FROM deleted)
        END
        ELSE
        BEGIN
            --INSERT
            INSERT INTO [dbo].[UserInfoComputed] (first_name,last_name, law_id)
            SELECT FirstName, LastName, ID FROM inserted
        END
    END
    ELSE IF EXISTS(SELECT * FROM DELETED)
    BEGIN
        --DELETE
        DELETE FROM [dbo].[UserInfoComputed]
        WHERE law_id = (SELECT id FROM deleted)
    END 
GO

是否有方法将类型值从
UserCompany
插入或更新到
ReconcileUserInfoComputed
触发器中的
UserInfoComputed
表中?

如果所有这些表都在同一数据库中,您是否考虑过使用触发器有一个主要缺陷,即您似乎认为它每行调用一次-这不是问题所在案例每个语句触发一次触发器,因此如果
UPDATE
语句影响25行,您将触发一次触发器,但是
Inserted
Deleted
将分别包含25行。您的代码将在此处选择这25行中的哪一行<代码>从已删除中选择id-它是不确定的。你需要重写你的触发器来考虑这一点!