在插入触发器SQL之前

时间:2012-11-15 08:08:32

标签: c# asp.net sql triggers insert

我有两个相同的表I_SubjectI_Temp_Subject,我想将Temp_Subject表复制到Subject表。简单用户使用I_Temp_Subject,管理员使用I_Subject。管理员可以直接将新记录插入I_Subject并验证I_Temp_Subject的内容。

两个表ID都设置为自动递增。复制SQL命令如下:

INSERT INTO I_SUBJECT(ID,CATEGORY_ID,USER_NAME,SERIAL_NUMBER,ICON)
SELECT ID,CATEGORY_ID,USER_NAME,SERIAL_NUMBER,ICON FROM I_TEMP_SUBJECT

如果我这样做,则会发生以下错误:

System.Data.SqlClient.SqlException: Cannot insert explicit value for identity
column in table 'I_SUBJECT' when IDENTITY_INSERT is set to OFF.

如果我在上述声明中没有包含ID,那么除了ID不相同外,一切正常。

所以我想要包含一个before insert触发器来检查插入是否有空ID然后自动增量(当Admin直接插入时)else如果插入的ID!= null则从I_Temp_Subject复制ID(当管理员验证)。

2 个答案:

答案 0 :(得分:2)

由于备份表是直接复制,我会关闭该备份表的自动增量,以便两者始终保持同步。 如果不是这个选项,请打开身份插入,但我认为这是不必要的。

SET IDENTITY_INSERT dbo.<tablename> ON
<your insert statements>
SET IDENTITY_INSERT dbo.<tablename> OFF

答案 1 :(得分:1)

您可以使用以下语句作为

关闭自动增量
SET IDENTITY_INSERT dbo.<tablename>  ON
 write your insert statement here 

然后关闭标识插入为SET IDENTITY_INSERT dbo。 OFF

    SET IDENTITY_INSERT dbo.I_SUBJECT  ON
    INSERT INTO I_SUBJECT(ID,CATEGORY_ID,USER_NAME,SERIAL_NUMBER,ICON)
    SELECT ID,CATEGORY_ID,USER_NAME,SERIAL_NUMBER,ICON FROM I_TEMP_SUBJECT
    SET IDENTITY_INSERT dbo.I_SUBJECT OFF