Нельзя удалить ограничение см предыдущие ошибки

I'm trying to drop a constraint on a DB table, something like: ALTER TABLE MyTable drop CONSTRAINT FK_MyTable_AnotherTable But the execution just runs and runs. If I stop it I see: Msg 3727, Lev...

I’m trying to drop a constraint on a DB table, something like:

ALTER TABLE MyTable drop CONSTRAINT FK_MyTable_AnotherTable

But the execution just runs and runs. If I stop it I see:

Msg 3727, Level 16, State 0, Line 2
Could not drop constraint. See previous errors.

Web search throws up various pages but note that the constraint is properly named and I am trying to remove it using the correct name

Filip Cornelissen's user avatar

asked Apr 7, 2010 at 13:53

DannykPowell's user avatar

DannykPowellDannykPowell

1,2275 gold badges18 silver badges30 bronze badges

0

I was having the same issue on SQL Server 2008 R2, I solved my problem with below line hopefully it will work for someone else as well :)

    Alter Table [Table Name]
    DROP Column [Column Name]

answered May 29, 2014 at 8:01

Zeeshan Ajmal's user avatar

Zeeshan AjmalZeeshan Ajmal

8801 gold badge16 silver badges29 bronze badges

2

Found a way to sort this, although I don’t understand why it was necessary.

Have been able to drop the constraint by disabling it first:

ALTER MyTable NOCHECK CONSTRAINT FK_MyTable_AnotherTable

The drop then completes fine

Would still welcome any comments on the reason why this is necessary

answered Apr 7, 2010 at 14:54

DannykPowell's user avatar

DannykPowellDannykPowell

1,2275 gold badges18 silver badges30 bronze badges

1

Verify that you’ve not already dropped the constraint, like:

SELECT OBJECT_ID('FK_MyTable_AnotherTable')

If this returns null, your constraint no longer exists. That would explain the error message.

answered Apr 7, 2010 at 13:56

Andomar's user avatar

3

I had same problem.

The reason was that I made a mistake in my cursor statement, which was iterating some constraint I was to drop.
So this error occurred when the constraint was actually removed in the same transaction. Then I did a rollback and checked if it existed: it did (of course, after rollback!).

Check if it really exists at the moment of dropping.

answered Dec 2, 2015 at 7:18

flam3's user avatar

flam3flam3

1,7991 gold badge17 silver badges26 bronze badges

I’m trying to drop a constraint on a DB table, something like:

ALTER TABLE MyTable drop CONSTRAINT FK_MyTable_AnotherTable

But the execution just runs and runs. If I stop it I see:

Msg 3727, Level 16, State 0, Line 2
Could not drop constraint. See previous errors.

Web search throws up various pages but note that the constraint is properly named and I am trying to remove it using the correct name

Filip Cornelissen's user avatar

asked Apr 7, 2010 at 13:53

DannykPowell's user avatar

DannykPowellDannykPowell

1,2275 gold badges18 silver badges30 bronze badges

0

I was having the same issue on SQL Server 2008 R2, I solved my problem with below line hopefully it will work for someone else as well :)

    Alter Table [Table Name]
    DROP Column [Column Name]

answered May 29, 2014 at 8:01

Zeeshan Ajmal's user avatar

Zeeshan AjmalZeeshan Ajmal

8801 gold badge16 silver badges29 bronze badges

2

Found a way to sort this, although I don’t understand why it was necessary.

Have been able to drop the constraint by disabling it first:

ALTER MyTable NOCHECK CONSTRAINT FK_MyTable_AnotherTable

The drop then completes fine

Would still welcome any comments on the reason why this is necessary

answered Apr 7, 2010 at 14:54

DannykPowell's user avatar

DannykPowellDannykPowell

1,2275 gold badges18 silver badges30 bronze badges

1

Verify that you’ve not already dropped the constraint, like:

SELECT OBJECT_ID('FK_MyTable_AnotherTable')

If this returns null, your constraint no longer exists. That would explain the error message.

answered Apr 7, 2010 at 13:56

Andomar's user avatar

3

I had same problem.

The reason was that I made a mistake in my cursor statement, which was iterating some constraint I was to drop.
So this error occurred when the constraint was actually removed in the same transaction. Then I did a rollback and checked if it existed: it did (of course, after rollback!).

Check if it really exists at the moment of dropping.

answered Dec 2, 2015 at 7:18

flam3's user avatar

flam3flam3

1,7991 gold badge17 silver badges26 bronze badges

Вопрос:

Я использую Microsoft SQL Server 2005 и относительно новичок в SQL в целом.

В базе данных “Информация” существует связь между двумя таблицами “Ресурсы” и “Групповые_ресурсы”. Ресурсы имеют внешний ключ, “id”, в Group_Resources с именем “resource_id”. Существует ограничение внешнего ключа, “fk_gr_res_resources”, между двумя.

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

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

ALTER TABLE [Information].[group_resources] DROP CONSTRAINT fk_gr_res_resources

и получил следующую ошибку:

‘fk_gr_res_resources’ не является ограничением. Не удалось отказаться от ограничения. См. Предыдущие ошибки.

Я смущен, потому что это ограничение, и нет орфографических ошибок. Я собираюсь удалить это ненадлежащим образом? Удаляю ли я ограничение из неправильной таблицы? Любые предложения были бы очень благодарны, и, пожалуйста, не плачьте мне: я все-таки новичок в SQL.

Лучший ответ:

Вы получаете эту ошибку:

Msg 3728, Level 16, State 1, Line 1
'fk_gr_res_resources' is not a constraint.
Msg 3727, Level 16, State 0, Line 1
Could not drop constraint. See previous errors.

Поскольку ограничение FK не существует!

Вы уверены, что Information – это правильное имя схемы, а не dbo?

1. Этот SQL докажет, что FK не существует:

SELECT * FROM sysobjects WHERE name = 'fk_gr_res_resources'

2. К сожалению, я ошибся в своем первоначальном ответе, вот правильный синтаксис для SQL Server:

ALTER TABLE <table_name>
DROP CONSTRAINT <foreignkey_name>

3. Пример для вашей базы данных:

IF EXISTS (SELECT * FROM sysobjects WHERE name = 'fk_gr_res_resources')
BEGIN
  ALTER TABLE Group_Resources
  DROP CONSTRAINT fk_gr_res_resources
END;

4. Попробуйте запустить это:

IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'fk_gr_res_resources')
BEGIN
  ALTER TABLE Group_Resources
  ADD CONSTRAINT fk_gr_res_resources
  FOREIGN KEY (resource_id)
  REFERENCES Resources(id) /* make sure Resources.id is a PRIMARY KEY */
END;

5. Затем попробуйте это и посмотрите, все ли вы получите эту ошибку:

ALTER TABLE Group_Resources
DROP CONSTRAINT fk_gr_res_resources

Другой синтаксис был для MySQL, извините:

ALTER TABLE <table_name>
DROP FOREIGN KEY <foreignkey_name>

Спасибо за исправление меня OMG Ponies!

Я создал ограничение, проверяющее положительность столбца, и не могу отказаться от ограничения, а точнее, я даже не понимаю, что ограничение существует. При попытке сбросить ограничение выдается сообщение об ошибке:

ALTER TABLE dbo.Test
DROP CONSTRAINT chk_positive;

Сообщение 3728, уровень 16, состояние 1, строка 1 «chk_positive» не является ограничением. Сообщение 3727, уровень 16, состояние 0, строка 1 Не удалось сбросить ограничение. Посмотреть предыдущие ошибки

Но затем экспериментируя и пытаясь повторно добавить ограничение, предполагает, что оно уже существует.

ALTER TABLE dbo.Test
ADD CONSTRAINT chk_positive CHECK (n_example > 0);

Msg 547, уровень 16, состояние 0, строка 1 Оператор ALTER TABLE конфликтует с ограничением CHECK «chk_positive». Конфликт произошел в базе данных «…», таблице «dbo.Test», столбце «n_example».

Глядя на результаты SELECT * FROM sys.check_constraints, нет упоминания об ограничении chk_positive, однако есть другие ограничения, которые я создал.

Есть идеи, почему это может происходить? Любая помощь приветствуется.

3 ответа

Лучший ответ

В SQL Server пространством имен для имен ограничений является вся схема, а не только таблица.

Другими словами, две таблицы не могут иметь одно и то же имя ограничения. Обычно, когда я называю ограничения, я включаю имя таблицы (в вашем случае, chk_test_positive было бы более вероятным именем).

Вы можете использовать information_schema.table_constraints, чтобы увидеть список ограничений. Должен быть chk_positive, который определен в другой таблице.

Мой совет: включите имя таблицы в имя ограничения.


2

Gordon Linoff
21 Ноя 2016 в 01:57

Постарайтесь показать все ограничения. Я предполагаю, что это проблема с заглавными буквами, попробуйте использовать []

SELECT OBJECT_NAME(object_id) AS ConstraintName,
       SCHEMA_NAME(schema_id) AS SchemaName,
       OBJECT_NAME(parent_object_id) AS TableName,
       type_desc AS ConstraintType
FROM sys.objects
WHERE type_desc LIKE ‘%CONSTRAINT’


0

Juan Carlos Oropeza
21 Ноя 2016 в 01:52

Выполните следующий запрос в базе данных, с которой вы работаете. Вы получите уже созданное контрольное ограничение (если оно есть) и соответствующее имя таблицы. Как другие догадались, созданное вами контрольное ограничение могло быть ошибочно создано в какой-то другой таблице. Тогда вы можете действовать соответственно.

 select 
        cc.name
        ,cc.object_id
        ,SysObj.name "TableName"
        ,cc.parent_object_id 
FROM sys.check_constraints cc
INNER JOIN sys.objects SysObj 
            on cc.parent_object_id=SysObj.object_id
WHERE LOWER(cc.name) LIKE '%positive%'


0

Santhoshkumar LM
21 Ноя 2016 в 08:17

  1. 13.03.2017, 08:34


    #1

    Обновление GK

    Господа, подскажите, может кто сталкивался. Обновляю БД с 3.25 до 3.33.

    Делаю это через SQL Managment Studio 2012.

    После выполнения первого скрипта 3.25-3.26 ругается на следующую строчку
    ALTER TABLE [gk].[GK_CARDS_EX] DROP CONSTRAINT [CHECK_GK_CARDS_NAME]
    Внимание! Изменение любой части имени объекта может разрушить скрипты и хранимые процедуры.
    Сообщение 3728, уровень 16, состояние 1, строка 6
    CHECK_GK_CARDS_NAME не является ограничением.
    Сообщение 3727, уровень 16, состояние 0, строка 6
    Нельзя удалить ограничение. См. предыдущие ошибки.

    Если игнорировать данное предупреждение, то дальнейшие скрипты до 3.33 проходят без ошибок.
    У меня знания в SQL и структуре БД GK не очень.
    Насколько это критично? Можно ли игнорировать или следует данную строчку как-то обработать перед выполнением скрипта 3.25-3.26

    Печатные формы, отчёты, выгрузки для ПО Shelter 2 / Shelter 1 / Abonement

    skype: alexem64, email: semenenkoav@gmail.com


  2. 13.03.2017, 13:43


    #2

    sibgaba вне форума


    Разбирающийся


    Я в SQL примерно как и ты, но чтение доки говорит о том что:

    …На данном этапе мы познакомились со всеми видами ограничений, в их самом простом виде, которые создаются командой вида «ALTER TABLE имя_таблицы ADD CONSTRAINT имя_ограничения …»:

    • PRIMARY KEY – первичный ключ;
    • FOREIGN KEY – настройка связей и контроль ссылочной целостности данных;
    • UNIQUE – позволяет создать уникальность;
    • CHECK – позволяет осуществлять корректность введенных данных;
    • DEFAULT – позволяет задать значение по умолчанию;
    • Так же стоит отметить, что все ограничения можно удалить, используя команду «ALTER TABLE имя_таблицы DROP CONSTRAINT имя_ограничения».

    DROP CONSTRAINT снимает ранее наложенное ограничение с поля таблицы.
    У тебя в ответе на команду говорится о том что невозможно снять ограничение т.к. на это поле никакх ограничений и так нет.

    Отсюда выходит что ошибка не критичная.

    Если есть под рукой не апгрейженая БД — посмотри есть ли на этом поле какие то DAFAULT, PRIMARY и т.п.
    Скорее всего их нет (либо они снялись где то раньше по ходу апгрейда

    Ильин Александр, Компания «Соттос»
    г Новосибирск +7 (383) 373-96-98; +7 (909) 533-93-92; nsk@sottos.ru
    г Омск +7 (3812) 377-902; +7 (905) 098-92-06; abc@sottos.ru
    www.sottos.ru | vk.com/sottos | fb.com/sottosru
    Продажа и установка ПО R-Keeper, обучение, техническая поддержка 24/7


  3. 17.03.2017, 05:59


    #3

    notb вне форума


    Сведущий


    В версии 3.33 используется новая электронная подпись для игровых карт.
    Перед обновлением необходимо подписать коды карт новыми подписями.
    Поскольку этот процесс достаточно продолжительный, перед обновлением необходимо заранее выгрузить игровые коды и прислать их на адрес gk@game-keeepr.com.

    Это они намекают, что без их участия, самим уже не обновится ?!?


  4. 17.03.2017, 06:04


    #4

    Hendehog вне форума


    Banned


    Цитата Сообщение от notb
    Посмотреть сообщение

    Это они намекают, что без их участия, самим уже не обновится ?!?

    Что значит намекают?
    Если ты обновишься и не загрузишь новые коды карт с подписью, у тебя все твои карты станут — СОМНИТЕЛЬНЫМИ.


  5. 17.03.2017, 06:28


    #5

    notb вне форума


    Сведущий


    Цитата Сообщение от Hendehog
    Посмотреть сообщение

    Что значит намекают?
    Если ты обновишься и не загрузишь новые коды карт с подписью, у тебя все твои карты станут — СОМНИТЕЛЬНЫМИ.

    т.е. все обновления будут с их участием, соответственно не бесплатные!


  6. 17.03.2017, 08:41


    #6

    sibgaba вне форума


    Разбирающийся


    т.е. все обновления будут с их участием, соответственно не бесплатные!

    Вот так и рождаются слухи…

    Вы бы, для начала, попробовали отписать по указанному мылу и посмотрели бы что вам ответят.
    А разговор, в общих чертах, будет такой:
    UCS: пришлите нам список номеров карт из Вашей БД. Если не знаете как это сделать — вот вам инструкция.
    Вы: Делаете то что нужно. Отправляете список карт.
    UCS: Вот эти номера карт были куплены официально. Вот вам для них цифровая подпись. Вот инструкция как подписать карты в новой БД.
    (Далее опционально): А вот эти вот эти номера карт были куплены вами ХЗ где (например в Страна Карт) и мы их подписывать не будем.

    И вот где тут про «не бесплатно???»

    Ильин Александр, Компания «Соттос»
    г Новосибирск +7 (383) 373-96-98; +7 (909) 533-93-92; nsk@sottos.ru
    г Омск +7 (3812) 377-902; +7 (905) 098-92-06; abc@sottos.ru
    www.sottos.ru | vk.com/sottos | fb.com/sottosru
    Продажа и установка ПО R-Keeper, обучение, техническая поддержка 24/7


  7. 17.03.2017, 09:43


    #7

    Hendehog вне форума


    Banned


    Цитата Сообщение от notb
    Посмотреть сообщение

    т.е. все обновления будут с их участием, соответственно не бесплатные!

    Все бесплатно.Правильно сигбаба говорит, вы бы хоть узнали сперва.
    Я тоже люблю юсиэс говном пополивать, но только за дело.
    Здесь они молодцы.
    Единственное — не быстро, хотя нам например быстро сделали.

    Правда обновились с третьего раза , у нас обновление два раза не вставало из-за того что в коде игровой зоны стоял знак «.».
    Кстати говоря, новое обновление распространяется и на gkatm терминальное , и если у вас в терминале новый ФР под ФЗ-54 не спешите обновляться, т.к новые ФР-ы в терминальном ПО сказали еще не поддерживаются.
    22ПТК у нас стоят, с новым обновлением пока полет нормальный.
    Теперь можно вбивать данные гостя номер или мыло и они даже в чеке печататься будут.


  8. 17.03.2017, 19:13


    #8

    notb вне форума


    Сведущий


    вот именно про это я и хотел узнать!)
    всем спасиба …
    зы
    вот только интересно, зачем им что-то слать, веть у них все и так должно быть, не проще ли бы просто запросить новые коды «своих» карт)———- Добавлено в 18:08 ———- Предыдущее сообщение было размещено в 18:03 ———-

    Единственное — не быстро, хотя нам например быстро сделали.

    а вот это вот ваобще сильно напрягает, если учесть, что все это может выполнять скрипт, вообще без человеко участия ….———- Добавлено в 18:13 ———- Предыдущее сообщение было размещено в 18:08 ———-ps

    Вот так и рождаются слухи…

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


  9. 20.03.2017, 05:55


    #9

    Hendehog вне форума


    Banned


    Цитата Сообщение от notb
    Посмотреть сообщение

    вот именно про это я и хотел узнать!)
    всем спасиба …
    зы
    вот только интересно, зачем им что-то слать, веть у них все и так должно быть, не проще ли бы просто запросить новые коды «своих» карт)———- Добавлено в 18:08 ———- Предыдущее сообщение было размещено в 18:03 ———-
    а вот это вот ваобще сильно напрягает, если учесть, что все это может выполнять скрипт, вообще без человеко участия ….———- Добавлено в 18:13 ———- Предыдущее сообщение было размещено в 18:08 ———-ps

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

    Скрипт сам коды потом по почтам рассылать будет?
    Ждать долго т.к большая очередь как они сказали.

    А , где говорили то, про платное обновление?


  10. 20.03.2017, 08:14


    #10

    notb вне форума


    Сведущий


    Скрипт сам коды потом по почтам рассылать будет?

    не вижу проблем)
    (по аналогии например как и с заявками на коды карт)

    А , где говорили то, про платное обновление?

    на сайте у них в прайсах есть обновление от 12т.р.
    больше нигде про обновления тишина и доступа свободного к ним я не нашел(
    А вот цитата из переписки с ucs, ответ на вопрос про обновление до актуальной версии

    Актуальная версия на сегодня 3.32. Описание изменений во вложении
    Стоимость работ по обновлению 12 000 руб.


Я создал несколько новых таблиц, и я заметил, что я не использовал хорошее соглашение об именах для идентификаторов.

Таким образом, я сделал новую add-migration с новыми идентификаторами, но когда я пытаюсь update-database меня есть следующая ошибка:

Ограничение «PK_dbo.DB_User_Type» ссылается на таблицу «AspNetUsers», ограничение внешнего ключа «FK_dbo.AspNetUsers_dbo.DB_User_Type_DB_User_Type_Id». Не удалось отказаться от ограничения. См. Предыдущие ошибки.

Я не понимаю, потому что скрипт начинается с сброса всех ограничений.

Может кто-нибудь объяснить, как решить эту ошибку, пожалуйста?

code first from an existing database я использую новый code first from an existing database подхода code first from an existing database из объекта 6.1. Вот функция Up

public override void Up()
        {
            DropForeignKey("dbo.DB_Company_Profile", "DB_Category_Id", "dbo.DB_Category");
            DropForeignKey("dbo.DB_Category_Translation", "DB_Category_Id", "dbo.DB_Category");
            DropForeignKey("dbo.DB_User_Type_Translation", "DB_User_Type_Id", "dbo.DB_User_Type");
            DropForeignKey("dbo.DB_Company_Profile", "category_id", "dbo.DB_Category");
            DropForeignKey("dbo.DB_Category_Translation", "category_id", "dbo.DB_Category");
            DropForeignKey("dbo.AspNetUsers", "DB_User_Type_user_type_id", "dbo.DB_User_Type");
            DropForeignKey("dbo.DB_User_Type_Translation", "user_type_id", "dbo.DB_User_Type");
            DropIndex("dbo.DB_Company_Profile", new[] { "DB_Category_Id" });
            DropIndex("dbo.DB_Category_Translation", new[] { "DB_Category_Id" });
            DropIndex("dbo.DB_User_Type_Translation", new[] { "DB_User_Type_Id" });
            DropColumn("dbo.DB_Company_Profile", "category_id");
            DropColumn("dbo.DB_Category_Translation", "category_id");
            DropColumn("dbo.DB_User_Type_Translation", "user_type_id");
            RenameColumn(table: "dbo.AspNetUsers", name: "DB_User_Type_Id", newName: "DB_User_Type_user_type_id");
            RenameColumn(table: "dbo.DB_Company_Profile", name: "DB_Category_Id", newName: "category_id");
            RenameColumn(table: "dbo.DB_Category_Translation", name: "DB_Category_Id", newName: "category_id");
            RenameColumn(table: "dbo.DB_User_Type_Translation", name: "DB_User_Type_Id", newName: "user_type_id");
            RenameIndex(table: "dbo.AspNetUsers", name: "IX_DB_User_Type_Id", newName: "IX_DB_User_Type_user_type_id");
            DropPrimaryKey("dbo.DB_Category");
            DropPrimaryKey("dbo.DB_User_Type");
            AddColumn("dbo.DB_Category", "category_id", c => c.Int(nullable: false, identity: true));
            AddColumn("dbo.DB_User_Type", "user_type_id", c => c.Int(nullable: false, identity: true));
            AlterColumn("dbo.DB_Company_Profile", "category_id", c => c.Int(nullable: false));
            AlterColumn("dbo.DB_Category_Translation", "category_id", c => c.Int(nullable: false));
            AlterColumn("dbo.DB_User_Type_Translation", "user_type_id", c => c.Int(nullable: false));
            AddPrimaryKey("dbo.DB_Category", "category_id");
            AddPrimaryKey("dbo.DB_User_Type", "user_type_id");
            CreateIndex("dbo.DB_Company_Profile", "category_id");
            CreateIndex("dbo.DB_Category_Translation", "category_id");
            CreateIndex("dbo.DB_User_Type_Translation", "user_type_id");
            AddForeignKey("dbo.DB_Company_Profile", "category_id", "dbo.DB_Category", "category_id", cascadeDelete: true);
            AddForeignKey("dbo.DB_Category_Translation", "category_id", "dbo.DB_Category", "category_id", cascadeDelete: true);
            AddForeignKey("dbo.DB_User_Type_Translation", "user_type_id", "dbo.DB_User_Type", "user_type_id", cascadeDelete: true);
            AddForeignKey("dbo.AspNetUsers", "DB_User_Type_user_type_id", "dbo.DB_User_Type", "user_type_id");
            DropColumn("dbo.DB_Category", "Id");
            DropColumn("dbo.DB_User_Type", "Id");
        }

Понравилась статья? Поделить с друзьями:
  • Неправильное употребление рода какая ошибка
  • Непоправимые ошибки примеры
  • Неправильно задано имя папки как исправить
  • Нельзя просматривать защищенное содержимое на этом устройстве windows 10 как исправить
  • Неправильное употребление паронимов это какая ошибка