web-dev-qa-db-fra.com

Impossible d'insérer une valeur explicite car IDENTITY_INSERT est désactivé, mais impossible de définir SET IDENTITY_INSERT sur ON car elle est déjà l'air

J'ai une table dans la base de données Foo nommée Bar, qui a une colonne nommée ID, qui est la clé primaire, et cette base de données vit sur le développement SQL Server.

J'essaie de copier les données de notre serveur de production sur le serveur de développement pour pouvoir jouer avec ces données. J'exécute donc ce qui suit:

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

Et j'ai l'erreur

Msg 8107, niveau 16, état 1, ligne 1
IDENTITY_INSERT est déjà activé pour la table 'Foo.dbo.Bar'. Impossible d'effectuer l'opération SET pour la table 'Foo.dbo.Bar'.

Hmm..okay, alors IDENTITY_INSERT est activé pour la table. J'ai donc supprimé le SET IDENTITY_INSERT Foo.dbo.Bar ON du haut de ma requête, puis je l'exécute et j'obtiens cette erreur:

Msg 544, niveau 16, état 1, ligne 1
Impossible d'insérer une valeur explicite pour la colonne d'identité dans la table 'Bar' lorsque IDENTITY_INSERT est défini sur OFF.

Je peux exécuter SET IDENTITY_INSERT Foo.dbo.Bar OFF toute la journée, mais si j'essaie de l'activer ON, alors SQL Server 2012 indique que IDENTITY_INSERT est déjà activé.

12
CurtisHx

Drôle - Je viens d’avoir exactement le même problème avec 3 des 4 tables de ma toute nouvelle base de données ss2012. 

Donc, j'ai réécrit le script de création de table pour encadrer mes insertions avec 'set identity on' et 'set identity off' et cela fonctionne. Il semble que ss ne veuille gérer que l'identité d'une table à la fois, c'est-à-dire que vous ne pouvez pas définir une nouvelle identité de table tant que toutes les autres n'ont pas été désactivées. 

quelque chose comme ça:

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

J'ai en fait trouvé une solution différente à cela. En réalité, il diffère de message 8101 , l'identité de la table n'étant pas définie sur ON.

Pour résoudre le problème, vous devez supprimer le schéma et les tables du même nom dans la base de données master .

J'ai un script de modèle qui crée une base de données et des tables et insère des données dans ces tables, quelque chose comme:

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

Le problème était que lors de la création de la base de données, l'instruction a échoué en raison de l'erreur "activation du périphérique" (autorisations sur le dossier dans lequel le fichier MDF sera créé) ou en raison de la taille du fichier de la base de données. Le script continue mais crée à la place les schémas et les tables dans master database. Après avoir réalisé l'erreur, j'ai arrêté le script et tenté de l'exécuter à nouveau en résolvant les problèmes de création.

Puis j'ai eu l'erreur. 

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.

Je ne suis pas un expert de SQL Server, mais je pense qu'il recherche d'abord le schéma dans la base de données master et, comme ce schéma est trouvé et que IDENTITY de la session en cours est déjà activé, il génère ce message d'erreur.

Après avoir supprimé les schémas et les tables créés de manière incorrecte dans la base de données master, mon script a été exécuté avec succès.

3
Xenno

J'ai eu exactement la même erreur. J'utilisais linq-to-sql et la table et le fichier dbml étaient initialement générés sans colonne d'identité sur la clé primaire.
J'ai par la suite mis à jour la clé primaire dans une colonne Identity, mais j'ai oublié de mettre à jour le fichier dbml. 

Impossible d'insérer une valeur explicite pour la colonne d'identité dans la table 'BLAH' lorsque IDENTITY_INSERT est défini sur OFF

Le correctif était de mettre à jour le fichier dbml de façon assez amusante ...

0
JumpingJezza