Sql 表“X”的标识\u插入已启用。无法对表“Y”执行设置操作

Sql 表“X”的标识\u插入已启用。无法对表“Y”执行设置操作,sql,sql-server,Sql,Sql Server,我创建了一个执行检查并自动将数据填充到两个表中的触发器。只有发生以下错误时才会发生: IDENTITY_INSERT is already ON for table 'X'. Cannot perform SET operation for table 'Y'. 我在研究错误时发现: 在任何时候,会话中只有一个表的IDENTITY_INSERT属性可以设置为ON。“ 因此,修复很容易: SET IDENTITY_INSERT Table1 ON -- insert statements for

我创建了一个执行检查并自动将数据填充到两个表中的触发器。只有发生以下错误时才会发生:

IDENTITY_INSERT is already ON for table 'X'. Cannot perform SET operation for table 'Y'.
我在研究错误时发现:

在任何时候,会话中只有一个表的IDENTITY_INSERT属性可以设置为ON。“

因此,修复很容易:

SET IDENTITY_INSERT Table1 ON
-- insert statements for table1
SET IDENTITY_INSERT Table1 OFF

SET IDENTITY_INSERT Table2 ON
-- insert statements for table2
SET IDENTITY_INSERT Table2 OFF

SET IDENTITY_INSERT Table3 ON
-- insert statements for table3
SET IDENTITY_INSERT Table3 OFF
但由于数据是通过触发器填充的,因此不可能这样做

有人能解决我的问题吗

我道歉

谢谢大家

触发---

CREATE TRIGGER Alert ON registos AFTER INSERT AS
BEGIN

DECLARE @comp decimal = 0
DECLARE @id_sensores_em_alerta decimal
DECLARE @tempmin decimal = 0
DECLARE @current_max_idAlarme int = (SELECT MAX(IdAlarme) FROM alarmes)
DECLARE @maxidAlarme int
DECLARE @temp decimal = (SELECT s.lim_inf_temp  from sensores s JOIN inserted i ON s.idSensor=i.idSensor )


-- Insert into alarmes from the inserted rows if temperature less than tempmin
INSERT alarmes (IdAlarme, descricao_alarme,data_criacao, idRegisto)
    SELECT
    ROW_NUMBER() OVER (ORDER BY i.idRegisto) + @current_max_idAlarme, 'temp Error', GETDATE(), i.idRegisto
    FROM
inserted AS i
    WHERE
i.Temperatura < @temp

SET @maxidAlarme = (SELECT MAX(IdAlarme) FROM alarmes)

INSERT INTO sensores_tem_alarmes(idSensor,idAlarme,dataAlarme) 
SELECT i.idSensor, @maxidAlarme, GETDATE()
FROM inserted i
SET @comp += 1;


SET @id_sensores_em_alerta=1;

SET  @id_sensores_em_alerta = (SELECT MAX(id_sensores_em_alerta)  FROM sensores_em_alerta)

INSERT INTO sensores_em_alerta(id_sensores_em_alerta, idSensor, idAlarme, data_registo, numerosensoresdisparados) 
SELECT @id_sensores_em_alerta, i.idSensor, @maxidAlarme, GETDATE(), @comp
FROM inserted i
end
数据库--


允许SQL Server为您自动插入标识值。由于这是一个触发器,一次可能插入多行。对于单行插入,可以使用SCOPE_IDENTITY函数检索上次插入行的标识值。但是,由于可以在触发器中插入多行,因此我们将使用OUTPUT子句为每个idRegisto返回插入的IdAlarme值的列表

我假设alarmes.IdAlarme和Sensors_em_alerta.id_Sensors_em_alerta是此触发器中的两个标识字段。如果是这种情况,那么这应该是可行的:

CREATE TRIGGER Alert ON registos AFTER INSERT AS
BEGIN

DECLARE @comp decimal = 0
DECLARE @id_sensores_em_alerta decimal
DECLARE @tempmin decimal = 0
DECLARE @temp decimal = (SELECT s.lim_inf_temp  from sensores s JOIN inserted i ON s.idSensor=i.idSensor )

DECLARE @tblIdAlarme TABLE (idRegisto int not null, IdAlarme int not null);

-- Insert into alarmes from the inserted rows if temperature less than tempmin
--  IdAlarme is identity field, so allow SQL Server to insert values automatically.
--      The new IdAlarme values are retrieved using the OUTPUT clause http://msdn.microsoft.com/en-us/library/ms177564.aspx
INSERT alarmes (descricao_alarme,data_criacao, idRegisto)
OUTPUT inserted.idRegisto, inserted.IdAlarme INTO @tblIdAlarme(idRegisto, IdAlarme)
    SELECT descricao_alarme = 'temp Error', data_criacao = GETDATE(), i.idRegisto
    FROM inserted AS i
    WHERE i.Temperatura < @temp
;

--It looks like this table needs a PK on both idSensor and idAlarme fields, or else you will get an error here 
--  if an alarm already exists for this idSensor.
INSERT INTO sensores_tem_alarmes(idSensor,idAlarme,dataAlarme) 
SELECT i.idSensor, a.IdAlarme, dataAlarme = GETDATE()
FROM inserted i
INNER JOIN @tblIdAlarme a ON i.idRegisto = a.idRegisto
;

--not sure what this is doing?? Will always be 1.
SET @comp += 1;

--id_sensores_em_alerta is an identity field, so allow SQL Server to insert values automatically
INSERT INTO sensores_em_alerta(idSensor, idAlarme, data_registo, numerosensoresdisparados) 
SELECT i.idSensor, a.IdAlarme, data_registo = GETDATE(), numerosensoresdisparados = @comp
FROM inserted i
INNER JOIN @tblIdAlarme a ON i.idRegisto = a.idRegisto
;

END

我有一个类似的问题,但它不涉及表触发器。我正在运行一个刷新多个表的数据的脚本,遇到了一个外键引用错误

根据:

在任何时候,会话中只有一个表可以具有标识\u INSERT 属性设置为ON

为了解决这个问题,我对每个试图插入的表都关闭了SET IDENTITY_INSERT[dbo].[table_name]。然后,在更正了引用错误后,我可以再次刷新我的表


编辑:我还应该提到,您可以断开连接,然后重新连接以重置会话。

而您的触发器看起来像…?在触发器内设置这些标识插入开/关。如果总是从触发器填充表,为什么在表上有标识字段。从表面上看,如果您有这么多的标识插入要执行,听起来您的标识列太多了…?谢谢大家的回复。因为我需要@HLGEM…有人知道解决这个问题的方法吗?我是一个傻瓜:可爱的兄弟。我花了很长时间才弄明白这个问题。10+附议@E-A,我在SSMS中打开了多个选项卡。我右键单击并断开所有连接(包括对象资源管理器)后,关闭所有会话,我重新连接,查询工作正常。