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
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, процедуры модификации структуры вызываются не только с клиента, но и из процедур миграции с сервера. и тогда открываться и откатываться транзакция будет уже из нескольких разных мест