Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление записи с полем Primary Key  [new]
wsnet
Member

Откуда:
Сообщений: 874
Коллеги, на MSSQL недавно, возникла ламерская незадача, пробую удалить запись в таблице A c PK и она удаляется благополучно при живом FK, который создан в таблице B и ссылается на удаленную запись с PK.

При этом FK стал равен null. Как сделать чтобы нельзя было удалить PK, на который ссылается FK.
30 ноя 18, 15:56    [21750244]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
wsnet,
автор
"и она удаляется благополучно при живом" "При этом FK стал равен null."

не такого поведения "по умолчанию".
30 ноя 18, 16:04    [21750270]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
invm
Member

Откуда: Москва
Сообщений: 8203
wsnet
Как сделать чтобы нельзя было удалить PK, на который ссылается FK.
Пересоздать FK без каскадных операций.
30 ноя 18, 16:04    [21750272]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
invm
wsnet
Как сделать чтобы нельзя было удалить PK, на который ссылается FK.
Пересоздать FK без каскадных операций.

я честно не пользуюсь, но какая из каскадных оперраций замиент на NULL при удалении?
30 ноя 18, 16:05    [21750275]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
court
Member

Откуда:
Сообщений: 1521
TaPaK
invm
пропущено...
Пересоздать FK без каскадных операций.

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


There are four available options in SQL Server 2005 and later versions (SQL Server 2016 as of today) as follows:

No Action
Cascade
SET NULL
SET Default
30 ноя 18, 16:13    [21750291]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
court
TaPaK
пропущено...

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


There are four available options in SQL Server 2005 and later versions (SQL Server 2016 as of today) as follows:

No Action
Cascade
SET NULL
SET Default

о, день прошёл не зря :)
30 ноя 18, 16:17    [21750297]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
wadegwadeg
Member

Откуда:
Сообщений: 35
TaPaK
invm
пропущено...
Пересоздать FK без каскадных операций.

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

Сильно.
https://docs.microsoft.com/ru-ru/sql/t-sql/statements/alter-table-table-constraint-transact-sql?view=sql-server-2017
30 ноя 18, 16:17    [21750299]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
wsnet
Member

Откуда:
Сообщений: 874
invm
wsnet
Как сделать чтобы нельзя было удалить PK, на который ссылается FK.
Пересоздать FK без каскадных операций.


Таки при создании FK на каскадные операции было no action.
30 ноя 18, 17:53    [21750546]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
wsnet
Member

Откуда:
Сообщений: 874
Попробывал пересоздать FK итог все тот же - можем удалить запись с PK. Где еще посмотреть?
30 ноя 18, 18:37    [21750622]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
court
Member

Откуда:
Сообщений: 1521
wsnet
Попробывал пересоздать FK итог все тот же - можем удалить запись с PK. Где еще посмотреть?
Триггер на удаление в А, который "зануллает" удаляемые записи в B
30 ноя 18, 18:44    [21750632]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
court
Member

Откуда:
Сообщений: 1521
court
wsnet
Попробывал пересоздать FK итог все тот же - можем удалить запись с PK. Где еще посмотреть?
Триггер на удаление в А, который "зануллает" удаляемые записи в B
INSTEAD OF , походу ...
30 ноя 18, 18:44    [21750633]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 886
wsnet,

уверены что правильно пересоздали? посмотрите результат запроса:
select delete_referential_action_desc, name from sys.foreign_keys where parent_object_id = object_id('имя вашей таблицы на которой висит FK', 'U')
30 ноя 18, 18:44    [21750634]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
wsnet
Member

Откуда:
Сообщений: 874
felix_ff
wsnet,

уверены что правильно пересоздали? посмотрите результат запроса:
select delete_referential_action_desc, name from sys.foreign_keys where parent_object_id = object_id('имя вашей таблицы на которой висит FK', 'U')


Ответ:
NO_ACTION	FK_inspection_plan_s_object
30 ноя 18, 19:05    [21750665]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
wsnet
Member

Откуда:
Сообщений: 874
court
court
пропущено...
Триггер на удаление в А, который "зануллает" удаляемые записи в B
INSTEAD OF , походу ...


Да откуда там триггеру взяться, таблицы недавно созданы, нет - триггеров на них не висит.
30 ноя 18, 19:07    [21750670]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
iap
Member

Откуда: Москва
Сообщений: 46475
Небось, удаляется запись, на которую никто не ссылается?
30 ноя 18, 19:32    [21750705]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
wsnet
Member

Откуда:
Сообщений: 874
iap, если бы было так. Запись удаляется, для которой есть данные в другой таблице.
30 ноя 18, 19:39    [21750713]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записи с полем Primary Key  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 886
wsnet,

хм, странно такого быть не должно если вы реально по факту все правильно сделали:
+ пример

drop table if exists dbo.t2;
drop table if exists dbo.t1;
go

create table dbo.t1 (id int primary key);
go
create table dbo.t2 (pk_id int, val varchar(255), constraint fk foreign key (pk_id) references dbo.t1(id) on delete set null)
go
insert into dbo.t1 values (1), (2) ,(3)
go
insert into dbo.t2 values (1, 'TEST'), (1, 'TEST'), (2, 'TEST2'), (3, 'TEST3')
go
begin try
insert into dbo.t2 values (4, 'TEST')
end try
begin catch
select error_number(), error_message()
end catch
go
select delete_referential_action_desc, * from sys.foreign_keys where parent_object_id = object_id('dbo.t2') --SET_NULL
go

begin tran
delete from dbo.t1 where id = 3
select * from dbo.t2 --запись с pk_id=3 стала NULL
rollback;
go

--пересоздаем fk
alter table dbo.t2 
drop constraint fk
go

alter table dbo.t2 
add constraint fk foreign key (pk_id) references dbo.t1(id)
go
select delete_referential_action_desc, * from sys.foreign_keys where parent_object_id = object_id('dbo.t2') --NO_ACTION
go
--//пересоздаем fk

begin tran
begin try
delete from dbo.t1 where id = 3
end try
begin catch
select error_number(), error_message()
select * from dbo.t2 --запись с pk_id=3 осталась нетронутой
end catch
rollback;
go

drop table if exists dbo.t2;
drop table if exists dbo.t1;
go

30 ноя 18, 21:30    [21750791]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить