【问题标题】:SQL Server 2008 - Help writing simple INSERT TriggerSQL Server 2008 - 帮助编写简单的 INSERT 触发器
【发布时间】:2009-08-31 05:26:50
【问题描述】:

这适用于 Microsoft SQL Server 2008。

我有 2 个表,Employee 和 EmployeeResult,我正在尝试在 EmployeeResult 上编写一个简单的 INSERT 触发器来执行此操作 - 每次在 EmployeeResult 中执行 INSERT,例如:

(杰克,200,销售) (简,300,市场营销) (约翰,400 岁,工程学)

它应该查找名称,部门条目对,例如

(杰克,销售), (简,市场营销), (约翰,工程)

在 Employee 表中,如果这样的员工不存在,则应将其插入到 Employee 表中。

我所拥有的是关于如何修复“???”的未知数:

CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
IF EXISTS (SELECT COUNT(*) FROM Employee WHERE ???)
  BEGIN
   INSERT INTO [Employee] (Name, Department) VALUES (???, ???)
  END

请帮忙,提前谢谢

架构:

Employee
--------
Name, varchar(50)
Department, varchar (50)

EmployeeResult
--------------
Name, varchar(50)
Salary, int
Department, varchar (50)

【问题讨论】:

    标签: sql sql-server-2008 insert triggers


    【解决方案1】:

    您希望利用触发器上下文中可用的插入逻辑表。它匹配要插入的表的架构并包括将插入的行(在更新触发器中,您可以访问 inserteddeleted分别代表新数据和原始数据的逻辑表。)

    因此,要插入当前不存在的员工/部门对,您可以尝试以下操作。

    CREATE TRIGGER trig_Update_Employee
    ON [EmployeeResult]
    FOR INSERT
    AS
    Begin
        Insert into Employee (Name, Department) 
        Select Distinct i.Name, i.Department 
        from Inserted i
        Left Join Employee e
        on i.Name = e.Name and i.Department = e.Department
        where e.Name is null
    End
    

    【讨论】:

      【解决方案2】:

      cmsjr 有正确的解决方案。我只是想为您未来的触发器开发指出几件事。如果您在触发器的插入中使用 values 语句,那么您做错事的可能性很大。对于插入、删除或更新的每批记录,触发器会触发一次。因此,如果在一批中插入十条记录,则触发器会触发一次。如果您要引用插入或删除中的数据并使用变量和值子句,那么您只会获取其中一条记录的数据。这会导致数据完整性问题。您可以通过使用上面 cmsjr 显示的基于集合的插入或使用光标来解决此问题。永远不要选择光标路径。触发器中的游标是一个等待发生的问题,因为它们很慢并且很可能会锁定您的表数小时。我从触发器中删除了一次光标,并将导入过程从 40 分钟缩短到 45 秒。

      您可能认为没有人会添加多条记录,但它发生的频率比大多数非数据库人员意识到的要频繁。不要编写在所有可能的插入、更新、删除条件下都不起作用的触发器。当他们必须从新客户那里导入 1,000,000 条销售目标记录或将所有价格更新 10% 或删除您不再销售其产品的供应商的所有记录时,没有人会使用一次一条记录的方法。

      【讨论】:

        【解决方案3】:

        检查此代码:

        CREATE TRIGGER trig_Update_Employee ON [EmployeeResult] FOR INSERT AS Begin   
            Insert into Employee (Name, Department)  
            Select Distinct i.Name, i.Department   
                from Inserted i
                Left Join Employee e on i.Name = e.Name and i.Department = e.Department
                where e.Name is null
        End
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-31
          • 1970-01-01
          • 2014-01-19
          相关资源
          最近更新 更多