我有两张表如下:
表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中插入数据。
答案 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的更多样本,请参阅给出的示例。
但是请注意我的话,我认为将技能保存在不同的主表中是一种替代设计。 在插入细节之前,我们通常会检查主服务器是否存在。 因此,您的控制通常可以以相反的方式运行。 用户通常首先插入主数据。在这种情况下,技能表数据。 然后填充详细信息。