SQL Server - BEFORE INSERT触发器

时间:2016-10-13 06:45:14

标签: sql sql-server sql-server-2008 tsql triggers

我有两张表如下:

表1' MySkills' [主键(EmpId,SkillId)]

+----------+------------+---------+----------+-----------+------------+-----------------+----------------+
|  EmpId   | CategoryId | SkillId | ExpYears | ExpMonths | Experience | RatingSubmitted | RatingApproved |
+----------+------------+---------+----------+-----------+------------+-----------------+----------------+
| CSSL9610 | arcgis     | arcgis1 | 0.00     | 0.00      | 0.00       | 1.00            | NULL           |
| CSSL9610 | arcgis     | arcgis2 | 0.00     | 0.00      | 0.00       | 0.00            | NULL           |
| CSSL9610 | arcgis     | arcgis3 | 0.00     | 0.00      | 0.00       | 0.00            | NULL           |
| CSSL9610 | arcgis     | arcgis4 | 0.00     | 0.00      | 0.00       | 0.00            | NULL           |
| CSSL9610 | arcgis     | arcgis5 | 0.00     | 0.00      | 0.00       | 0.00            | NULL           |
| CSSL9610 | arcgis     | arcgis6 | 0.00     | 0.00      | 0.00       | 0.00            | NULL           |
| CSSL9610 | arcgis     | arcgis7 | 0.00     | 0.00      | 0.00       | 0.00            | NULL           |
+----------+------------+---------+----------+-----------+------------+-----------------+----------------+

表1' MySkills_details' [主键(EmpId)]

+-------+------------------+---------------+----------------+--------+---------------+---------+------------+
| EmpId | Experience_Prior | Qualification | Specialization | Status | LastSubmitted | NextDue | ApprovedOn |
+-------+------------------+---------------+----------------+--------+---------------+---------+------------+

目前,MySkills_details中没有数据。 我必须在MySkills中使用引用EmpId的MySkills_details在EmpId上创建一个外键,由于MySkills中的复合主键,这是不可能的。 所以我决定走另一条路。除了首先在MySkills中进行插入,并且据我所知,SQL Server中没有BEFORE INSERT触发器。 那么,如何编写像BEFORE INSERT这样的触发器,它在插入MySkills之前首先在MySkill_details中插入数据。

1 个答案:

答案 0 :(得分:3)

请测试以下SQL Server而不是Trigger,它会检查第一个详细信息表。 如果Details中缺少数据,则会插入该表 作为第二步,它继续插入技能表

CREATE Trigger MySkillsInsteadOfInsert on dbo.MySkills Instead Of Insert
AS
Begin

    insert into MySkills_details (
        EmpId -- and other relevant columns
    )
    select i.EmpId -- and other relevant columns
    from inserted i
    left join MySkills_details d on i.EmpId = d.EmpId
    where d.EmpId is null

    Insert Into MySkills(EmpId) -- and other relevant columns
    Select EmpId -- and other relevant columns
    From inserted i;

End

有关SQL Server instead Of trigger的更多样本,请参阅给出的示例。

但是请注意我的话,我认为将技能保存在不同的主表中是一种替代设计。 在插入细节之前,我们通常会检查主服务器是否存在。 因此,您的控制通常可以以相反的方式运行。 用户通常首先插入主数据。在这种情况下,技能表数据。 然后填充详细信息。