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

You are getting this error:

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.

Because the FK constraint does not exist!

Are you sure that Information is the right schema name and not dbo?

1. This SQL will prove that the FK does not exist:

SELECT * FROM sysobjects WHERE name = 'fk_gr_res_resources'

2. Oops, I was wrong in my original answer, here is the correct syntax for SQL Server:

ALTER TABLE <table_name>
DROP CONSTRAINT <foreignkey_name>

3. Example for your database:

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

4. Try running this:

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. Then try this and see if you still get that error:

ALTER TABLE Group_Resources
DROP CONSTRAINT fk_gr_res_resources

The other syntax was for MySQL, sorry:

ALTER TABLE <table_name>
DROP FOREIGN KEY <foreignkey_name>

Обновлено

Вопрос:

Я использую 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!

User-1846805900 posted

Hi

i have an SQL database and have many tables on it — table products has coulnm «IDPr» it’s identity and get Id automatically

now i need to set this coulnm to be not identity (i know i can from SQL Server — but i need to do it throw EF Migrations )

i have edit coulnm «IDPr» in products class as:

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int IDPr { get; set; }

and do Migrations as:

Add-Migration product

and file was generated is:

    public partial class product : DbMigration
    {
        public override void Up()
        {
            DropForeignKey("dbo.OrdersPurchasesDetails", "IDPr", "dbo.products");
            DropForeignKey("dbo.OrdersSalesDetails", "IDPr", "dbo.products");
            DropForeignKey("dbo.PricingDetails", "IDPr", "dbo.products");
            DropPrimaryKey("dbo.products");
            AlterColumn("dbo.products", "IDPr", c => c.Int(nullable: false));
            AddPrimaryKey("dbo.products", "IDPr");
            AddForeignKey("dbo.OrdersPurchasesDetails", "IDPr", "dbo.products", "IDPr");
            AddForeignKey("dbo.OrdersSalesDetails", "IDPr", "dbo.products", "IDPr");
            AddForeignKey("dbo.PricingDetails", "IDPr", "dbo.products", "IDPr");
        }
        
        public override void Down()
        {
            DropForeignKey("dbo.PricingDetails", "IDPr", "dbo.products");
            DropForeignKey("dbo.OrdersSalesDetails", "IDPr", "dbo.products");
            DropForeignKey("dbo.OrdersPurchasesDetails", "IDPr", "dbo.products");
            DropPrimaryKey("dbo.products");
            AlterColumn("dbo.products", "IDPr", c => c.Int(nullable: false, identity: true));
            AddPrimaryKey("dbo.products", "IDPr");
            AddForeignKey("dbo.PricingDetails", "IDPr", "dbo.products", "IDPr");
            AddForeignKey("dbo.OrdersSalesDetails", "IDPr", "dbo.products", "IDPr");
            AddForeignKey("dbo.OrdersPurchasesDetails", "IDPr", "dbo.products", "IDPr");
        }
    }

but when run (update-database) i got error:

PM> Update-Database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201604242329265_product].
Applying explicit migration: 201604242329265_product.
System.Data.SqlClient.SqlException (0x80131904): 'PK_dbo.products' is not a constraint.
Could not drop constraint. See previous errors.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
   at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
   at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
   at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:27c72781-9e2f-4a85-a61a-4e44cce49c05
Error Number:3728,State:1,Class:16
'PK_dbo.products' is not a constraint.
Could not drop constraint. See previous errors.
PM> 

so please how can i make it works throw EF Migrations ?

Я пытаюсь удалить ограничение на таблицу БД, что-то вроде:

ALTER TABLE MyTable drop CONSTRAINT FK_MyTable_AnotherTable

Но исполнение просто работает и работает. Если я остановлю это, я увижу:

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

Веб-поиск выдает различные страницы, но обратите внимание, что ограничение правильно названо, и я пытаюсь удалить его, используя правильное имя

2010-04-07 13:53

4
ответа

Решение

Нашел способ разобраться в этом, хотя я не понимаю, зачем это было нужно.

Смогли снять ограничение, сначала отключив его:

ALTER MyTable NOCHECK CONSTRAINT FK_MyTable_AnotherTable

Затем падение завершается нормально

Все равно приветствую любые комментарии о причине, почему это необходимо


user67617

07 апр ’10 в 14:54
2010-04-07 14:54

2010-04-07 14:54

У меня была такая же проблема на SQL Server 2008 R2, я решил свою проблему с помощью строки ниже, надеюсь, она будет работать и для кого-то еще:)

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

2014-05-29 08:01

Убедитесь, что вы еще не сняли ограничение, например:

SELECT OBJECT_ID('FK_MyTable_AnotherTable')

Если это вернется nullВаше ограничение больше не существует. Это объяснило бы сообщение об ошибке.


user50552

07 апр ’10 в 13:56
2010-04-07 13:56

2010-04-07 13:56

У меня была такая же проблема.

Причина заключалась в том, что я допустил ошибку в своем выражении курсора, которое повторяло некоторое ограничение, которое я должен был отбросить. Таким образом, эта ошибка произошла, когда ограничение было фактически удалено в той же транзакции. Затем я сделал откат и проверил, существует ли он: он сделал (конечно, после отката!).

Проверьте, действительно ли он существует в момент сброса.

2015-12-02 07:18

Logo
MurCode

  • Форумы
  • Поиск
  • О проекте

Mike_za

Дата: 09.10.2013 18:08:04

pkarklin,

нормальный набор ддл инструкций запускать с клиента?

Уленшпигель

Дата: 09.10.2013 20:00:25

Mike_za, судя по всему, вы получаете сообщение о последней ошибке. И это ошибка №3727. Перед ней была настоящая, но она потеряна. Удалить ограничение, чаще всего, нельзя потому что

1) ограничения с таким именем нет
2) у вас нет прав на его удаление
3) удаление блокируется блокировкой :), т.е. таблицей пользуется кто-то еще.

Уберите try и посмотрите все ошибки, которые происходят в процессе.

Уленшпигель

Дата: 09.10.2013 20:18:26

Mike_za
нормальный набор ддл инструкций запускать с клиента?

Откуда у годно. Вас же уже спросили: в чем задача заключается? Получить сообщение на клиенте? Или устранить проблему? Если первое — то надо знать какими компонентами доступа пользуетесь на клиенте. Если второе — то надо узнать, в чем, собственно, проблема.

pkarklin

Дата: 09.10.2013 21:11:09

Mike_za
нормальный набор ддл инструкций запускать с клиента?

Да! Как минимум странно накатывать очередной хотфикс на сервер, городя для этого на сервере городушки.

Mike_za

Дата: 10.10.2013 12:07:12

Уленшпигель
Откуда у годно. Вас же уже спросили: в чем задача заключается? Получить сообщение на клиенте? Или устранить проблему? Если первое — то надо знать какими компонентами доступа пользуетесь на клиенте. Если второе — то надо узнать, в чем, собственно, проблема.

как я написал в своем первом сообщении, моя проблема заключается в получении первой ошибки из обработчика.

pkarklin
Да! Как минимум странно накатывать очередной хотфикс на сервер, городя для этого на сервере городушки.

У нашего продукта очень много пользователей со своими собственными серверами, на которые регулярно накатываются обновления базы данных.
На клиенте есть дизайнеры «документов» и «справочников». при этом на сервере создаются реальные хранилища (несколько таблиц) под каждый объект.

Имеем больше 10тысяч таблиц. и кучу динамического SQL.
В частности, мы поимели проблемы при удалении записи из таблицы, на которую ведут связи от нескольких сотен таблиц. Вы сталкивались?

какая-то бизнес логика есть в среднем слое на шарпе. Но основной объем кода, касающийся работы с объектами базы данных (таблицы, ключи, связи) лежит в процедурах. Разработчики клиентской части на SQL НЕ пишут. Плюс, все что связано с правами доступа, разруливается на уровне сервера. Пользователю даются права на вызов «процедуры-редактора» структуры документа или справочника, но при этом его учетка не имеет прав напрямую модифицировать структуры таблиц, и он не сможет ничего «разломать структуру», зайдя через студию, в обход логики процедуры

Такая архитектура «исторически сложилась» и менять ее уже возможности нет

Уленшпигель

Дата: 10.10.2013 20:06:03

Mike_za
моя проблема заключается в получении первой ошибки из обработчика.
Mike_za
какая-то бизнес логика есть в среднем слое на шарпе.

Т.е., если я правильно понял, вы используете ADO.NET. Тогда, возможно, вам поможет это. Но только если убрать try в tsql.

Mike_za

Дата: 11.10.2013 12:08:17

вопрос именно про «НЕ УБИРАТЬ TRY»

Гость333

Дата: 11.10.2013 12:16:36

Mike_za,

Можно убрать TRY из скрипта на T-SQL.
Но оставить try в вашей программе-клиенте.

pkarklin

Дата: 11.10.2013 12:27:37

автор
В частности, мы поимели проблемы при удалении записи из таблицы, на которую ведут связи от нескольких сотен таблиц. Вы сталкивались?

Да, сталкиваюсь постоянно.

автор
Разработчики клиентской части на SQL НЕ пишут. Плюс, все что связано с правами доступа, разруливается на уровне сервера. Пользователю даются права на вызов «процедуры-редактора» структуры документа или справочника, но при этом его учетка не имеет прав напрямую модифицировать структуры таблиц, и он не сможет ничего «разломать структуру», зайдя через студию, в обход логики процедуры

А я и не говорил, что накатывание заплат на бд — это дело обычного пользователя. А DBA имеют необходимые права и с ошибками разберутся.

Mike_za

Дата: 11.10.2013 17:35:35

pkarklin, процедуры модификации структуры вызываются не только с клиента, но и из процедур миграции с сервера. и тогда открываться и откатываться транзакция будет уже из нескольких разных мест

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Нельзя сидеть сложив руки ошибка
  • Нельзя проверить подпись сертификата код ошибки 0x80096004
  • Нельзя построить красивый дом сложа рукава речевая ошибка
  • Нельзя повторить одну ошибку дважды во второй
  • Нельзя отправить сообщение ошибка 28

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии