[解決済み] テーブル 'X' の IDENTITY_INSERT はすでにオンになっています。テーブル 'Y' に対して SET 操作を実行できません。
質問
私は、チェックを実行し、自動的に2つのテーブルにデータを入力するトリガーを作成しました。ただ、次のようなエラーが発生します。
IDENTITY_INSERT is already ON for table 'X'. Cannot perform SET operation for table 'Y'.
エラーについて調べていたら、こんなものを見つけました。
"常に、セッション内の1つのテーブルだけが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
DataBase----
解決方法は?
SQL Server が自動的に ID 値を挿入するようにする。 これはトリガーなので、一度に複数行が挿入される可能性があります。 一行挿入の場合は
SCOPE_IDENTITY()
関数(
http://msdn.microsoft.com/en-us/library/ms190315.aspx
) を使用して、最後に挿入した行の ID 値を取得します。
しかし
トリガで複数行を挿入することができるため、ここでは
OUTPUT
節(
http://msdn.microsoft.com/en-us/library/ms177564.aspx
を挿入したリストを取得します。
IdAlarme
の値は、それぞれの
idRegisto
.
想定しているのは
alarmes.IdAlarme
と
sensores_em_alerta.id_sensores_em_alerta
は、このトリガーの2つのIDフィールドです。 もしそうであれば、これはうまくいくはずです。
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
関連
-
[解決済み】 "指定された集約関数を含まないクエリを実行しようとしました。"
-
[解決済み] ERROR: 参照されたテーブル "bar" の与えられたキーに一致するユニークな制約がありません。
-
[解決済み】2つの列を分割する方法は?
-
[解決済み] テスト
-
[解決済み】INTERSECTとINNER JOINは根本的に違うのか?[重複している]
-
[解決済み] SQLクエリ「00904. 00000 - "%s: 無効な識別子".
-
[解決済み] ORA-00920: 無効な関係演算子
-
[解決済み] SQLエラーです。ORA-00922: オプションがないか無効です。
-
[解決済み] CLOBとNCLOBの違いは何ですか?
-
[解決済み】SQL Server 既存テーブルへのSELECT。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ストアドプロシージャーのエラー ORA-06550
-
[解決済み] varchar データ型から datetime データ型に変換すると、SQL クエリで範囲外の値が発生する
-
[解決済み】Teradata - 計算中に数値のオーバーフローが発生しました。
-
[解決済み】使用されるSELECT文は列の数が異なる(REDUX!)
-
[解決済み] データ型 varchar の変換エラー
-
[解決済み] エラー (ORA-00923: 期待された場所に FROM キーワードが見つかりませんでした)
-
[解決済み] リンクされたサーバーの NULL に対して OLE DB プロバイダー Microsoft.Jet.OLEDB.4.0 のインスタンスを作成できません。
-
[解決済み] 集計を行わずに行から列へピボット移動する
-
[解決済み] PostgreSQL - json 型の等値演算子を識別できませんでした。
-
[解決済み] マルチパート識別子をバインドできなかった