Casper-SC
@Casper-SC
Программист (.NET)

Как удалить ограничения по умолчанию в моём конкретном случае?

Создаю таблицу и добавляю данные. Потом мне нужно удалить ограничения из этой таблицы и добавить новые.
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)

Как удалить ограничения по умолчанию, которые безымянные.
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
@Noxy
увлекаюсь SQL
Я так понимаю надо грохнуть PK?

SELECT * FROM dbo.sysobjects WHERE xtype = 'PK' and parent_obj = OBJECT_ID('CONTENT_TFS')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы