Sql ошибка строки не были обновлены

I have three tables in SQL Server 2008 R2: Country Address and Country_Address


Country has columns:

CountryID Country

1, Afghanistan

2, Australia


Address has columns:

AddressID Address

1, 5 Smith Way


Country_Address has columns:

CountryID AddressID

1, 1

edit: so in the example, 5 smith way is an address for Afghanistan.

I have emptied the tables, then added two countries and one address, and then a link in Country_Address between 1 and 1. When I try to update the CountryID from 1 to 2, I can’t because of FK constraint. I don’t understand why this is, because the CountryID I am trying to assign does exist. So how do I manage to update it?


edit1: This is the error I get when I try to do the update in SQL Management Studio, I get InvalidOperationException — «The model of type ‘…’ could not be updated.» in Visual Studio.

No row was updated.

The data in row 1 was not committed.
Error Source: .Net SqlClient Data
Provider. Error Message: The UPDATE
statement conflicted with the FOREIGN
KEY constraint
«FK_Country_Address_Address». The
conflict occurred in database
«…», table
«dbo.Address», column ‘AddressID’.

The statement has been terminated.

Студворк — интернет-сервис помощи студентам

случилось первый раз 3 недели назад
веб запрос типа:

C#
1
cmd.CommandText = "UPDATE  Заявки SET [приоритет] = @приоритет, [Срок] = '" + Срок + "' WHERE ([ID_Заявка] = " + номер + ")";

на изменение записи в таблице SQL сервера выдал ошибку.
в тоже самое время изменение других записей этой же таблице отрабатывается нормально.
пробую изменить «противную» строку через SQL Server Management Studio прямо в таблице…
ага.
«Строки не были обновлены.
Данные в строке не были зафиксированы.
Источник ошибки: .Net SqlClient Data Provider.
Сообщение об ошибке: Время ожидания выполнения истекло…»

запросом:

SQL
1
2
3
UPDATE [dbo].[Заявки]
SET [приоритет] = 'Низкий ' 
WHERE [ID_Заявка] = '1836'

— выполнение зависает, долго не жду — останавливаю, так как «подвисает» вся база.

ничего толкового сделать не успел. проблема «рассосалась» сама через некоторое время.
сегодня повторилось тоже самое.

что с этим делать? как бороться?

SQL Server Express (64-bit) 2012

Напишите, пожалуйста, любой пример триггера, выдающего сообщение при ошибке. Хоть какой..

Modus's user avatar

Modus

8,83525 серебряных знаков65 бронзовых знаков

задан 21 ноя 2011 в 14:33

vRILANA's user avatar

 CREATE
TRIGGER HotelSuitesSchedule_upd
ON dbo.HotelSuitesSchedule
for UPDATE
AS
begin
--
SET NOCOUNT ON
--
declare @n as int

  if exists
  (select i.id
    from inserted i inner join deleted d on i.id = d.id
     where (i.seat1>0 and d.seat1>0 and i.seat1<>d.seat1) or
    (i.seat2>0 and d.seat2>0 and i.seat2<>d.seat2))
   begin
    select @n=hs.RoomNumber
     from inserted i inner join deleted d on i.id = d.id
        left join HotelSuites hs with(nolock) on i.ID_HotelSuite=hs.ID
     where (i.seat1>0 and d.seat1>0 and i.seat1<>d.seat1) or
    (i.seat2>0 and d.seat2>0 and i.seat2<>d.seat2)
    RAISERROR ('Место в номере № %d уже забронировано!', 16, 1,@n) with SETERROR
   end
 end

ответ дан 21 ноя 2011 в 16:35

minamoto's user avatar

minamotominamoto

4,01113 серебряных знаков19 бронзовых знаков

Для MSSQL, вешаем на таблицу dbo.MyTable триггер на вставку:

CREATE TRIGGER dbo.MyTable_OnInsert ON  dbo.MyTable
   AFTER INSERT
AS 
BEGIN
    DECLARE @name VARCHAR(255)
    SELECT @name=i.name FROM inserted i

    IF @name ='Foo'
      RAISERROR ('Внимание! Попытка записать Foo!', 16, 1)
END

Если теперь попытаться добавить строку, содержащую в качестве поля name строковое выражение 'Foo', получим сообщение об ошибке:

————————— Среда Microsoft SQL Server Management Studio
Express
————————— Ни одной строки не было обновлено.

Данные в строке 1 не были
зафиксированы. Источник ошибки: .Net
SqlClient Data Provider. Сообщение об
ошибке: Внимание! Попытка записать
Foo!

Исправьте ошибку и повторите попытку
или нажмите клавишу ESC, чтобы
отменить изменения.
————————— ОК Справка

ответ дан 21 ноя 2011 в 16:35

Nofate's user avatar

NofateNofate

34.3k15 золотых знаков65 серебряных знаков93 бронзовых знака

5

Для MSSQL, вешаем на таблицу dbo.MyTable триггер на вставку:

CREATE TRIGGER dbo.MyTable_OnInsert ON  dbo.MyTable
   AFTER INSERT
AS 
BEGIN
    DECLARE @name VARCHAR(255)
    SELECT @name=i.name FROM inserted i

    IF @name ='Foo'
      RAISERROR ('Внимание! Попытка записать Foo!', 16, 1)
END

Если теперь попытаться добавить строку, содержащую в качестве поля name строковое выражение 'Foo', получим сообщение об ошибке:

————————— Среда Microsoft SQL Server Management Studio
Express
————————— Ни одной строки не было обновлено.

Данные в строке 1 не были
зафиксированы. Источник ошибки: .Net
SqlClient Data Provider. Сообщение об
ошибке: Внимание! Попытка записать
Foo!

Исправьте ошибку и повторите попытку
или нажмите клавишу ESC, чтобы
отменить изменения.
————————— ОК Справка

При попытке добавить данные во вновь созданный столбец с помощью SQL Server Management Studio (редактирование строк) я получаю следующую ошибку:

Ни одна строка не была обновлена.

Данные в строке 1 не были зафиксированы.

Источник ошибки: поставщик данных.Net SqlClient.

Сообщение об ошибке: строка или двоичные данные будут усечены.

Заявление было прекращено.

Исправьте ошибки и повторите попытку или нажмите ESC, чтобы отменить изменения.

Тип данных для столбца — nvarchar(150).


ОБНОВИТЬ:
Я вставляю только несколько символов ascii (пример: abc).

Это чужая база данных, которая попросила меня разобраться в ней… Я обнаружил: а) только некоторые строки дают эту ошибку б) строки, дающие эту ошибку, имеют длинные строки в двух других столбцах (один из них — nvarchar (max) и один — это текст).

2010-03-01 15:01

3
ответа

Решение

Я испытал это в тех случаях, когда на столе была смесь ntext а также nvarchar(MAX) типы данных. Меняя все ntextс nvarchar(MAX)с исправляет проблему.

2014-05-28 09:16

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

2010-03-01 18:12

Я получил эту ошибку, когда по ошибке превысил количество символов, которое может содержать поле. В Visual Studio я по ошибке вставил поле с его типом данных как nvarchar(1) и пытался сохранить слово с 6 символами в этом поле. Как только я перешел на nvarchar (50), он работал нормально. Надеюсь, это кому-нибудь поможет.


Dev

07 май ’15 в 16:19
2015-05-07 16:19

2015-05-07 16:19

Обычно это происходит при попытке вставить больше символов, чем указано в этом поле. идти к
Design, проверить
Data Type поля для примера ваш
Data Type = nvarchar(20) и ваш пробный набор 30 символов


Microsoft SQL Server 2014



28 янв ’20 в 15:59
2020-01-28 15:59

2020-01-28 15:59

Понравилась статья? Поделить с друзьями:
  • Sql ошибка transaction log is full
  • Sql ошибка state 42000 native
  • Sql ошибка could not be bound
  • Sql ошибка check the manual that corresponds
  • Sql server ошибка the login failed