Как отбросить ограничение SQL по умолчанию, не зная его имени? - PullRequest
181 голосов
/ 16 сентября 2009

В Microsoft SQL Server я знаю запрос, чтобы проверить, существует ли ограничение по умолчанию для столбца, и отбросить ограничение по умолчанию:

IF EXISTS(SELECT * FROM sysconstraints
  WHERE id=OBJECT_ID('SomeTable')
  AND COL_NAME(id,colid)='ColName'
  AND OBJECTPROPERTY(constid, 'IsDefaultCnst')=1)    
ALTER TABLE SomeTable DROP CONSTRAINT DF_SomeTable_ColName

Но из-за опечатки в предыдущих версиях базы данных имя ограничения могло быть DF_SomeTable_ColName или DF_SmoeTable_ColName.

Как я могу удалить ограничение по умолчанию без ошибок SQL? Имена ограничений по умолчанию не отображаются в таблице INFORMATION_SCHEMA, что несколько усложняет ситуацию.

Итак, что-то типа «удалить ограничение по умолчанию в этой таблице / столбце» или «удалить DF_SmoeTable_ColName», но не выдает никаких ошибок, если он не может его найти.

Ответы [ 14 ]

0 голосов
/ 18 апреля 2017

Всегда генерируйте скрипт и проверяйте его перед запуском. Ниже сценария

  select 'Alter table dbo.' + t.name + ' drop constraint '+ d.name  
  from sys.tables t
  join sys.default_constraints d on d.parent_object_id = t.object_id
  join sys.columns c on c.object_id = t.object_id
       and c.column_id = d.parent_column_id
  where c.name in ('VersionEffectiveDate','VersionEndDate','VersionReasonDesc')
  order by t.name
0 голосов
/ 13 марта 2017

Я надеюсь, что это может быть полезно для тех, у кого есть подобные проблемы. В окне ObjectExplorer выберите свою базу данных => Таблицы, => свою таблицу => Ограничения. Если клиент определен во время создания столбца, вы можете увидеть имя ограничения по умолчанию, включая имя столбца. затем используйте:

ALTER TABLE  yourTableName DROP CONSTRAINT DF__YourTa__NewCo__47127295;

(имя ограничения - только пример)

0 голосов
/ 07 июля 2016

Полезно для некоторых столбцов, в которых было несколько default constraints or check constraints создано:

Изменено https://stackoverflow.com/a/16359095/206730 скрипт

Примечание: этот скрипт предназначен для sys.check_constraints

declare @table_name nvarchar(128)
declare @column_name nvarchar(128)
declare @constraint_name nvarchar(128)
declare @constraint_definition nvarchar(512)

declare @df_name nvarchar(128)
declare @cmd nvarchar(128) 

PRINT 'DROP CONSTRAINT [Roles2016.UsersCRM].Estado'

declare constraints cursor for 
 select t.name TableName, c.name ColumnName, d.name ConstraintName, d.definition ConstraintDefinition
 from sys.tables t   
 join sys.check_constraints d  on d.parent_object_id = t.object_id  
 join sys.columns c  on c.object_id = t.object_id      
 and c.column_id = d.parent_column_id
 where t.name = N'Roles2016.UsersCRM' and c.name = N'Estado'

open constraints
fetch next from constraints into @table_name , @column_name, @constraint_name, @constraint_definition
while @@fetch_status = 0
BEGIN
    print 'CONSTRAINT: ' + @constraint_name
    select @cmd = 'ALTER TABLE [' + @table_name +  '] DROP CONSTRAINT [' +  @constraint_name + ']'
    print @cmd
    EXEC sp_executeSQL @cmd;

  fetch next from constraints into @table_name , @column_name, @constraint_name, @constraint_definition
END

close constraints 
deallocate constraints
0 голосов
/ 18 июня 2015

У меня было несколько столбцов, в которых было создано несколько ограничений по умолчанию, поэтому я создаю следующую хранимую процедуру:

CREATE PROCEDURE [dbo].[RemoveDefaultConstraints] @table_name nvarchar(256), @column_name nvarchar(256)
AS
BEGIN

    DECLARE @ObjectName NVARCHAR(100)

    START: --Start of loop
    SELECT 
        @ObjectName = OBJECT_NAME([default_object_id]) 
    FROM 
        SYS.COLUMNS
    WHERE 
        [object_id] = OBJECT_ID(@table_name) 
        AND [name] = @column_name;

    -- Don't drop the constraint unless it exists
    IF @ObjectName IS NOT NULL
    BEGIN
        EXEC ('ALTER TABLE '+@table_name+' DROP CONSTRAINT ' + @ObjectName)
        GOTO START; --Used to loop in case of multiple default constraints
    END
END
GO

-- How to run the stored proc.  This removes the default constraint(s) for the enabled column on the User table.
EXEC [dbo].[RemoveDefaultConstraints] N'[dbo].[User]', N'enabled'
GO

-- If you hate the proc, just get rid of it
DROP PROCEDURE [dbo].[RemoveDefaultConstraints]
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...