Lxocram
Joined: 07 Jun 2007 Posts: 13 Location: Belgium, Ghent
|
Posted: Thu Mar 01, 2012 3:50 pm Post subject: Force column order - Identity_Insert when no PK defined |
|
|
When i put option Force Column Order on I frequently get errors like
Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'tmp_rg_xx_sec_dossierbeheerder_departement' when IDENTITY_INSERT is set to OFF.
The problem occurs when the table has no PK but it does have an identity column(wich is in fact a PK column)
The synchronization script is missing two statements
PRINT N'Rebuilding [dbo].[sec_dossierbeheerder_departement]'
GO
CREATE TABLE [dbo].[tmp_rg_xx_sec_dossierbeheerder_departement]
(
[ID_Link_Dossierbeheerder_Departement] [int] NOT NULL IDENTITY(1, 1),
[ID_departement] [tinyint] NULL,
[ID_Personeelslid_Dossierbeheerder] [int] NULL,
[geldig_van] [datetime] NOT NULL DEFAULT ('01/01/1900'),
[geldig_tot] [datetime] NOT NULL DEFAULT ('31/12/2999'),
[geldig] AS (case when [Geldig_Van]<dateadd(day,(0),datediff(day,(0),getdate())) AND [geldig_Tot]>=dateadd(day,(0),datediff(day,(0),getdate())) then (1) else (0) end),
[NTUsername] AS ([dbo].[get_Username_Personeelslid_COMPUTED_COLUMN]([ID_Personeelslid_Dossierbeheerder]))
)
GO
SET IDENTITY INSERT [dbo].[tmp_rg_xx_sec_dossierbeheerder_departement] ON
go
INSERT INTO [dbo].[tmp_rg_xx_sec_dossierbeheerder_departement]([ID_Link_Dossierbeheerder_Departement], [ID_departement], [ID_Personeelslid_Dossierbeheerder], [geldig_van], [geldig_tot]) SELECT [ID_Link_Dossierbeheerder_Departement], [ID_departement], [ID_Personeelslid_Dossierbeheerder], [geldig_van], [geldig_tot] FROM [dbo].[sec_dossierbeheerder_departement]
GO
SET IDENTITY INSERT [dbo].[tmp_rg_xx_sec_dossierbeheerder_departement] OFF
GO
DECLARE @idVal BIGINT
SELECT @idVal = IDENT_CURRENT(N'[dbo].[sec_dossierbeheerder_departement]')
IF @idVal IS NOT NULL
DBCC CHECKIDENT(N'[dbo].[tmp_rg_xx_sec_dossierbeheerder_departement]', RESEED, @idVal)
GO
DROP TABLE [dbo].[sec_dossierbeheerder_departement] |
|
Lxocram
Joined: 07 Jun 2007 Posts: 13 Location: Belgium, Ghent
|
Posted: Tue Mar 06, 2012 10:33 am Post subject: |
|
|
Chris,
128 is returned
I've tried it again with an other table
creation script (SSMS)
| Code: |
CREATE TABLE [dbo].[kzlst_Opleiding_Voorzitter](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ID_Opleiding] [int] NOT NULL,
[ID_Opleidingsvoorzitter] [int] NOT NULL,
[Geldig_Van] [datetime] NOT NULL,
[Geldig_Tot] [datetime] NOT NULL,
[GELDIG] AS (case when [Geldig_Van]<dateadd(day,(0),datediff(day,(0),getdate())) AND [geldig_Tot]>=dateadd(day,(0),datediff(day,(0),getdate())) then (1) else (0) end),
[ID_Departement] AS ([dbo].[getID_Departement_From_ID_Opleiding_COMPUTED_COLUMN]([ID_Opleiding])),
CONSTRAINT [PK__kzlst_Opleiding___17F5F1ED] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[kzlst_Opleiding_Voorzitter] ADD CONSTRAINT [DF_kzlst_Opleiding_Voorzitter_Geldig_Van] DEFAULT ('01/10/2009') FOR [Geldig_Van]
GO
ALTER TABLE [dbo].[kzlst_Opleiding_Voorzitter] ADD CONSTRAINT [DF_kzlst_Opleiding_Voorzitter_Geldig_Tot] DEFAULT ('31/12/2999') FOR [Geldig_Tot]
GO |
SYNCRO SCRIPT (with ignore check constraints OFF and ignore identy increment OFF)
| Code: |
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
USE [GPS]
GO
PRINT N'Disabling DDL triggers'
GO
DISABLE TRIGGER ALL ON DATABASE
GO
PRINT N'Dropping constraints from [dbo].[kzlst_Opleiding_Voorzitter]'
GO
ALTER TABLE [dbo].[kzlst_Opleiding_Voorzitter] DROP CONSTRAINT [PK__kzlst_Opleiding___17F5F1ED]
GO
PRINT N'Dropping constraints from [dbo].[kzlst_Opleiding_Voorzitter]'
GO
ALTER TABLE [dbo].[kzlst_Opleiding_Voorzitter] DROP CONSTRAINT [DF__kzlst_Opl__Geldi__60D0A58C]
GO
PRINT N'Dropping constraints from [dbo].[kzlst_Opleiding_Voorzitter]'
GO
ALTER TABLE [dbo].[kzlst_Opleiding_Voorzitter] DROP CONSTRAINT [DF__kzlst_Opl__Geldi__61C4C9C5]
GO
PRINT N'Rebuilding [dbo].[kzlst_Opleiding_Voorzitter]'
GO
CREATE TABLE [dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter]
(
[ID] [int] NOT NULL IDENTITY(1, 1),
[ID_Opleiding] [int] NOT NULL,
[ID_Opleidingsvoorzitter] [int] NOT NULL,
[Geldig_Van] [datetime] NOT NULL DEFAULT ('01/10/2009'),
[Geldig_Tot] [datetime] NOT NULL DEFAULT ('31/12/2999'),
[GELDIG] AS (case when [Geldig_Van]<dateadd(day,(0),datediff(day,(0),getdate())) AND [geldig_Tot]>=dateadd(day,(0),datediff(day,(0),getdate())) then (1) else (0) end),
[ID_Departement] AS ([dbo].[getID_Departement_From_ID_Opleiding_COMPUTED_COLUMN]([ID_Opleiding]))
)
GO
INSERT INTO [dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter]([ID], [ID_Opleiding], [ID_Opleidingsvoorzitter], [Geldig_Van], [Geldig_Tot]) SELECT [ID], [ID_Opleiding], [ID_Opleidingsvoorzitter], [Geldig_Van], [Geldig_Tot] FROM [dbo].[kzlst_Opleiding_Voorzitter]
GO
DECLARE @idVal BIGINT
SELECT @idVal = IDENT_CURRENT(N'[dbo].[kzlst_Opleiding_Voorzitter]')
IF @idVal IS NOT NULL
DBCC CHECKIDENT(N'[dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter]', RESEED, @idVal)
GO
DROP TABLE [dbo].[kzlst_Opleiding_Voorzitter]
GO
EXEC sp_rename N'[dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter]', N'kzlst_Opleiding_Voorzitter'
GO
PRINT N'Re-enabling DDL triggers'
GO
ENABLE TRIGGER trgNoRightJoins ON DATABASE
GO |
As you can see:
* the constraints are not recreated under the same name (even if they were the same)
* the primary key attribute is not recreated at all (even if it was there)
Then I went back to the synchronisation option and found that ignore Identity property on columns was on
SO if column on receiving end is allready an identity column and ignore identity property is ON the synchronisation fails
Furthermore i changed 'ignore CONSTRAINT AND INDEX NAMES' to OFF
| Code: |
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
USE [GPS]
GO
PRINT N'Disabling DDL triggers'
GO
DISABLE TRIGGER ALL ON DATABASE
GO
PRINT N'Dropping constraints from [dbo].[kzlst_Opleiding_Voorzitter]'
GO
ALTER TABLE [dbo].[kzlst_Opleiding_Voorzitter] DROP CONSTRAINT [PK__kzlst_Opleiding___17F5F1ED]
GO
PRINT N'Dropping constraints from [dbo].[kzlst_Opleiding_Voorzitter]'
GO
ALTER TABLE [dbo].[kzlst_Opleiding_Voorzitter] DROP CONSTRAINT [DF__kzlst_Opl__Geldi__60D0A58C]
GO
PRINT N'Dropping constraints from [dbo].[kzlst_Opleiding_Voorzitter]'
GO
ALTER TABLE [dbo].[kzlst_Opleiding_Voorzitter] DROP CONSTRAINT [DF__kzlst_Opl__Geldi__61C4C9C5]
GO
PRINT N'Rebuilding [dbo].[kzlst_Opleiding_Voorzitter]'
GO
CREATE TABLE [dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter]
(
[ID] [int] NOT NULL IDENTITY(1, 1),
[ID_Opleiding] [int] NOT NULL,
[ID_Opleidingsvoorzitter] [int] NOT NULL,
[Geldig_Van] [datetime] NOT NULL CONSTRAINT [DF_kzlst_Opleiding_Voorzitter_Geldig_Van] DEFAULT ('01/10/2009'),
[Geldig_Tot] [datetime] NOT NULL CONSTRAINT [DF_kzlst_Opleiding_Voorzitter_Geldig_Tot] DEFAULT ('31/12/2999'),
[GELDIG] AS (case when [Geldig_Van]<dateadd(day,(0),datediff(day,(0),getdate())) AND [geldig_Tot]>=dateadd(day,(0),datediff(day,(0),getdate())) then (1) else (0) end),
[ID_Departement] AS ([dbo].[getID_Departement_From_ID_Opleiding_COMPUTED_COLUMN]([ID_Opleiding]))
)
GO
SET IDENTITY_INSERT [dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter] ON
GO
INSERT INTO [dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter]([ID], [ID_Opleiding], [ID_Opleidingsvoorzitter], [Geldig_Van], [Geldig_Tot]) SELECT [ID], [ID_Opleiding], [ID_Opleidingsvoorzitter], [Geldig_Van], [Geldig_Tot] FROM [dbo].[kzlst_Opleiding_Voorzitter]
GO
SET IDENTITY_INSERT [dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter] OFF
GO
DECLARE @idVal BIGINT
SELECT @idVal = IDENT_CURRENT(N'[dbo].[kzlst_Opleiding_Voorzitter]')
IF @idVal IS NOT NULL
DBCC CHECKIDENT(N'[dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter]', RESEED, @idVal)
GO
DROP TABLE [dbo].[kzlst_Opleiding_Voorzitter]
GO
EXEC sp_rename N'[dbo].[tmp_rg_xx_kzlst_Opleiding_Voorzitter]', N'kzlst_Opleiding_Voorzitter'
GO
PRINT N'Re-enabling DDL triggers'
GO
ENABLE TRIGGER trgNoRightJoins ON DATABASE
GO |
It is still missing the PK constraint
So i put the option 'ignore indexes' OFF
I thought the ignore options where there to not detect a difference between tables, I did not know the full impact on the synchronisation script. If the table is synchronized for another reason (column order) and theres a table rebuild, it should not throw away constraints that were allready there (but ignored for tablediff) |
|