web-dev-qa-db-ja.com

IDENTITY_INSERTがOFFであるため明示的な値を挿入できませんが、IDENTITY_INSERTはすでにONであるためONに設定できません

データベースFooBarという名前のテーブルがあり、これにはIDという名前の列が主キーであり、このデータベースは開発用SQL Server上にあります。

データを本番サーバーから開発サーバーにコピーして、そのデータを操作できるようにしたいので、次を実行します。

set IDENTITY_INSERT Foo.dbo.Bar ON
insert into Foo.dbo.Bar
(
   ID
   ,Something
   ,Else
   ,Is
   ,Going
   ,Horribly
   ,Wrong
   ,With
   ,SQL
)
select 
  ID
  ,Something
  ,Else
  ,Is
  ,Going
  ,Horribly
  ,Wrong
  ,With
  ,SQL
from Production.Foo.dbo.Bar

set IDENTITY_INSERT Foo.dbo.Bar OFF

そして、私はエラーが出ます

メッセージ8107、レベル16、状態1、行1
テーブル 'Foo.dbo.Bar'のIDENTITY_INSERTはすでにオンです。テーブル 'Foo.dbo.Bar'に対してSET操作を実行できません。

うーん、大丈夫なので、IDENTITY_INSERTはテーブルに対してオンになっています。だから私はSET IDENTITY_INSERT Foo.dbo.Bar ONクエリの先頭から実行して実行すると、次のエラーが発生します。

メッセージ544、レベル16、状態1、行1
IDENTITY_INSERTがOFFに設定されている場合、テーブル 'Bar'のID列に明示的な値を挿入できません。

SET IDENTITY_INSERT Foo.dbo.Bar OFF一日中ですが、それをONに変えようとすると、SQL Server 2012はIDENTITY_INSERTはすでにオンになっています。

12
CurtisHx

おかしい-私はまったく新しいss2012データベースの4つのテーブルのうち3つでまったく同じ問題が発生しました。

だから私は 'create identity on'と 'set identity off'で私の挿入をまとめるようにテーブル作成スクリプトを書き直し、それが機能します。 ssは一度に1つのテーブルのIDのみを処理したいようです。つまり、他のすべてのテーブルがオフになるまで、新しいテーブルIDをオンに設定できません。

このようなもの:

create table Employers
(
id int PRIMARY KEY IDENTITY ,
companyid nvarchar(50) not null,
companyName nvarchar(80) not null,
address nvarchar(80),
Phone nvarchar(10),
);

SET IDENTITY_INSERT employers ON;

insert into Employers(id,companyid,companyName,address,Phone)
Values
(...),
(...)

SET IDENTITY_INSERT employers OFF;

create table customers
(
...
3
jmaschle

私は実際にこれに対する別の解決策を見つけました。これは実際にはMsg 8101とは異なり、テーブルIDがONに設定されていないことに固有です。

この問題を解決するには、同じ名前のスキーマとテーブルをmasterデータベースにドロップする必要があります。

データベースとテーブルを作成し、それらのテーブルにデータを挿入するテンプレートスクリプトがあります。

USE master
GO
CREATE DATABASE [mydb] ON  PRIMARY 
( NAME = N'mydb', FILENAME = N'C:\SQLDATA\mydb.mdf' , SIZE = 5072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'mydb_log', FILENAME = N'C:\SQLDATA\mydb_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
GO

USE [mydb]
GO

CREATE SCHEMA [myschema] AUTHORIZATION [dbo]
GO

CREATE TABLE [myschema].[mytable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SOMETHING] [int] NOT NULL,
CONSTRAINT [PK_mytable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90)
)
GO

SET IDENTITY_INSERT [myschema].[mytable] ON 
GO

INSERT [myschema].[mytable] ([ID], [SOMETHING]) VALUES (1,2)
GO

SET IDENTITY_INSERT [myschema].[mytable] OFF
GO

問題は、データベースの作成中に、「デバイスのアクティブ化」エラー(MDFファイルが作成されるフォルダーへのアクセス許可)が原因で、またはデータベースファイルのサイズが原因で、ステートメントが失敗したことでした。スクリプトは続行しましたが、スキーマとテーブルをmasterデータベースに作成しました。エラーに気付いた後、スクリプトを停止し、作成の問題を修正して再度実行しようとしました。

次に、エラーが発生しました。

Msg 8107, Level 16, State 1, Line 2
IDENTITY_INSERT is already ON for table 'master.myschema.mytable'. Cannot perform SET operation for table 'myschema.mytable'.
Msg 544, Level 16, State 1, Line 2
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is   set to OFF.

私はSQL Serverのエキスパートではありませんが、最初にマスターデータベースでスキーマを検索すると思います。このスキーマが見つかり、現在のセッションで既にIDENTITYがオンになっているため、このエラーメッセージが表示されます。

Masterデータベースに誤って作成されたスキーマとテーブルを削除した後、スクリプトは正常に実行されました。

3
Xenno

まったく同じエラーが発生しました。 linq-to-sqlと、テーブルとdbmlファイルは、主キーのID列なしで最初に生成されました。
後で主キーをIdentity列に更新しましたが、dbmlファイルを更新するのを忘れていました。

IDENTITY_INSERTがOFFに設定されている場合、テーブル 'BLAH'のID列に明示的な値を挿入できません

修正はおかしなことにdbmlファイルを更新することでした...

0
JumpingJezza