Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Добавить колонку к существующей таблице как одно из ключевых полей  [new]
Degun
Member

Откуда:
Сообщений: 205
Имеется некоторая таблица dbo.MoneyLimits. Следует добавть к ней ещё одну колонку LimitKind varchar(3) NOT NULL, но так, чтобы эта колонка стала одним из ключевых полей. Планирую сделать это следующим скриптом. Правильно ли он отработает?
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.MoneyLimits ADD
	LimitKind varchar(3) NOT NULL
GO
ALTER TABLE dbo.MoneyLimits
	DROP CONSTRAINT PK_MoneyLimits
GO
ALTER TABLE dbo.MoneyLimits ADD CONSTRAINT
	PK_MoneyLimits PRIMARY KEY CLUSTERED 
	(
	LoadDate, ClientCode, CurrCode, FirmID, Tag, LimitKind
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.MoneyLimits SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
15 авг 13, 15:03    [14713513]     Ответить | Цитировать Сообщить модератору
 Re: Добавить колонку к существующей таблице как одно из ключевых полей  [new]
Glory
Member

Откуда:
Сообщений: 104760
Degun
Правильно ли он отработает?

Протестировать не судьба что ли ?
15 авг 13, 15:10    [14713572]     Ответить | Цитировать Сообщить модератору
 Re: Добавить колонку к существующей таблице как одно из ключевых полей  [new]
Degun
Member

Откуда:
Сообщений: 205
При создании колонки пешет:
Msg 4901, Level 16, State 1, Line 1
Инструкция ALTER TABLE допускает добавление только тех столбцов, которые могут содержать значения NULL, имеют указанное определение DEFAULT, являются столбцами идентификаторов или отметки времени; если ни одно из вышеперечисленных условий не выполнено, для добавления такого столбца таблица должна быть пустой. Не удалось добавить столбец "LimitKind" в непустую таблицу "MoneyLimits", так как она не соответствует этим условиям.

Как быть тогда, ведь для того, чтобы столбец мог входить в первичный ключ у него не должно быть значения по умолчанию?
15 авг 13, 15:17    [14713640]     Ответить | Цитировать Сообщить модератору
 Re: Добавить колонку к существующей таблице как одно из ключевых полей  [new]
Glory
Member

Откуда:
Сообщений: 104760
Degun
Как быть тогда, ведь для того, чтобы столбец мог входить в первичный ключ у него не должно быть значения по умолчанию?

Это вы откуда взяли ?
15 авг 13, 15:20    [14713665]     Ответить | Цитировать Сообщить модератору
 Re: Добавить колонку к существующей таблице как одно из ключевых полей  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Degun
ведь для того, чтобы столбец мог входить в первичный ключ у него не должно быть значения по умолчанию?

Почему вы так решили?
CREATE TABLE #t (id int DEFAULT(1) PRIMARY KEY)

Command(s) completed successfully.
15 авг 13, 15:21    [14713675]     Ответить | Цитировать Сообщить модератору
 Re: Добавить колонку к существующей таблице как одно из ключевых полей  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.MoneyLimits ADD
	LimitKind varchar(3) NULL
GO
UPDATE dbo.MoneyLimits SET LimitKind = ...
GO
ALTER TABLE dbo.MoneyLimits ALTER COLUMN
	LimitKind varchar(3) NOT NULL
GO
ALTER TABLE dbo.MoneyLimits
	DROP CONSTRAINT PK_MoneyLimits
GO
ALTER TABLE dbo.MoneyLimits ADD CONSTRAINT
	PK_MoneyLimits PRIMARY KEY CLUSTERED 
	(
	LoadDate, ClientCode, CurrCode, FirmID, Tag, LimitKind
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.MoneyLimits SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Если на таблице есть индексы, рассмотрите вариант суррогатного PK.
15 авг 13, 15:47    [14713864]     Ответить | Цитировать Сообщить модератору
 Re: Добавить колонку к существующей таблице как одно из ключевых полей  [new]
Degun
Member

Откуда:
Сообщений: 205
При создании колонки задал дефолтное значение. Такой скрипт отработал нормально:
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.MoneyLimits ADD
	LimitKind varchar(3) NOT NULL DEFAULT ''
GO
ALTER TABLE dbo.MoneyLimits
	DROP CONSTRAINT PK_MoneyLimits
GO
ALTER TABLE dbo.MoneyLimits ADD CONSTRAINT
	PK_MoneyLimits PRIMARY KEY CLUSTERED 
	(
	LoadDate, ClientCode, CurrCode, FirmID, Tag, LimitKind
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.MoneyLimits SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
15 авг 13, 16:44    [14714325]     Ответить | Цитировать Сообщить модератору
 Re: Добавить колонку к существующей таблице как одно из ключевых полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Degun,

сдаётся мне, ссылаться на такой длинный PK - никакого удовольствия!
И держать во всех ссылающихся таблицах вот эти вот 6 полей... :((

А зачем Вы SETы написали в своей явной транзакции?
15 авг 13, 16:50    [14714374]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить