Создаю таблицу и добавляю данные. Потом мне нужно удалить ограничения из этой таблицы и добавить новые.
CREATE TABLE dbo.CONTENT_TFS (
TFS_ID BIGINT NOT NULL,
TFS_CONTENT NVARCHAR(1024) NOT NULL,
PRIMARY KEY CLUSTERED (TFS_ID)
) ON [PRIMARY]
GO
INSERT INTO dbo.CONTENT_TFS (TFS_ID, TFS_CONTENT)
VALUES
(1, '111'),
(2, '222')
GO
Дальше мне нужно добавить колонку и поставить ограничение. То есть сделать составной ключ из TFS_ID, SERVER_ID
ALTER TABLE dbo.CONTENT_TFS
ADD SERVER_ID INT NOT NULL DEFAULT (-1); -- -1, как не заданный идентификатор
GO
---- Удаляем ограничение первичного ключа.
--ALTER TABLE dbo.CONTENT_TFS
-- DROP CONSTRAINT
--GO
ALTER TABLE dbo.CONTENT_TFS
ADD CONSTRAINT PK_CONTENT_TFS PRIMARY KEY NONCLUSTERED (TFS_ID, SERVER_ID)
GO
В итоге я хочу получить таблицу, которая бы получилось создай я её так (единственное. что ограничения уже будут именованные, на это не обращайте внимание, тут чисто я привёл итоговую таблицу, чтобы было ясно к чему я иду):
CREATE TABLE dbo.CONTENT_TFS (
TFS_ID BIGINT,
TFS_CONTENT NVARCHAR(1024) NOT NULL,
SERVER_ID INT NOT NULL,
PRIMARY KEY NONCLUSTERED (TFS_ID, SERVER_ID)
)
Нашёл такие варианты, но, видимо, я что-то делаю неправильно.
DECLARE @constraint sysname
SELECT @constraint = object_name(default_object_id)
FROM sys.columns
WHERE object_id = object_id('[dbo].[CONTENT_TFS]') AND name = 'TFS_ID'
-- Add additional criteria here if required
IF len(@constraint) > 0
BEGIN
EXEC ('ALTER TABLE [dbo].[CONTENT_TFS] DROP CONSTRAINT ' + @constraint)
END
ELSE
BEGIN
Print ('No CONSTRAINT found')
END
DECLARE @defname VARCHAR(100), @cmd VARCHAR(1000)
SET @defname =
(
SELECT name
FROM sysobjects so JOIN sysconstraints sc ON so.id = sc.constid
WHERE object_name(so.parent_obj) = 'CONTENT_TFS' AND so.xtype = 'D'
AND sc.colid = (
SELECT colid FROM syscolumns WHERE id = object_id('dbo.CONTENT_TFS') AND name = 'TFS_ID')
)
SET @cmd = 'ALTER TABLE dbo.CONTENT_TFS DROP CONSTRAINT ' + @defname
EXEC(@cmd)
Как удалить ограничения по умолчанию, которые безымянные.