Установить идентичность Seed в динамическое значение - PullRequest
1 голос
/ 23 марта 2012

Мы хотели установить начальное значение идентификатора с помощью

DBCC CHECKIDENT ('myTable', RESEED, 0)

, но у нас сложилось впечатление, что учетная запись службы, которая выполняет этот код, должна бытьназначена роль db_ddladmin, чтобы иметь возможность сделать это.Это правда?Если это так, то для нас это не разрешено из-за политики.

Если это так, я рассмотрел эту альтернативу:

--Create a test table


/****** Object:  Table [dbo].[People2]    Script Date: 03/22/2012 19:07:12 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[People2](
    [PersonId] [int] IDENTITY(1,1) NOT NULL,
    [LastName] [varchar](50) NOT NULL,
    [FirstName] [varchar](50) NOT NULL,
 CONSTRAINT [PK_People2] PRIMARY KEY CLUSTERED 
(
    [PersonId] 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

SET ANSI_PADDING OFF
GO


---Proof of concept

declare @seed int = 1000 --Set the seed

SET IDENTITY_INSERT People2 ON

--Insert a dummy record to increment the identity counter to 1 less than the value that we really want
Insert into people2
(PersonId, LastName,FirstName)
values
(@seed-1, 'temp','dummy')

SET IDENTITY_INSERT People2 OFF

--Delete the record that we just inserted (for no otehr purpose than setting the seed)
delete from People2 where personid = @seed-1  

--Do your normal code to populate the People2 dest table
Insert into people2
(LastName,FirstName)
values
('Jones','John')

--Verify that the seed was set to the value we wanted

select * from People2

Другие соображения включают вставку во временную таблицукоторый мы создаем с использованием динамического SQL, который содержит начальное значение идентификатора, взятое из переменной.

Менее привлекательным подходом было бы перелистывать записи и увеличивать ID вручную, а не автоматически столбцом.

Таблицы подсчета возможны, но меня смущают.

Предложения?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Если вам разрешено иметь ALTER разрешения для таблицы, вы можете использовать SET IDENTITY_INSERT в качестве первого значения. Это обновит семя для вас.

По ссылке выше относительно использования SET IDENTITY_INSERT:

If the value inserted is larger than the current identity value for the table,
SQLServer automatically uses the new inserted value as the current identity value
0 голосов
/ 23 марта 2012

Почему не просто

CREATE TABLE [dbo].[People2](
[PersonId] [int] IDENTITY(1000,1) NOT NULL,   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...