|
Удаление строки в связанных таблицах
|
|||
---|---|---|---|
#18+
Есть 2 таблицы связанные внешним ключом (FK_ValsPrices_DataVals). В свойствах ключа прописано каскадное удаление. Фото в прилагаемой картинке. Есть триггер на удаление: USE [ztt] GO /****** Object: Trigger [dbo].[DeleteTrigger] Script Date: 20.04.2021 8:00:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER TRIGGER [dbo].[DeleteTrigger] ON [dbo].[DataVals] INSTEAD OF DELETE AS -- проверяем нет ли ссылок на шифр вала в сертификатах SET NOCOUNT ON; DECLARE @nCntr Integer DECLARE @idDataVal Integer; SET @idDataVal = (SELECT TOP 1 idDataVals FROM deleted); SET @nCntr = 0; SET @nCntr = (SELECT TOP 1 idDataVals FROM CertOutData WHERE idDataVals=@idDataVal); if ISNULL(@nCntr,0)=0 BEGIN DELETE ValsPrices WHERE idDataVals=@idDataVal; DELETE DataVals WHERE idDataVals=@idDataVal; END При попытке удалить запись: DELETE FROM [ztt].[dbo].[DataVals] WHERE ([idDataVals]=2006) Выдает ошибку: Msg 547, Level 16, State 0, Procedure DeleteTrigger, Line 17 [Batch Start Line 0] The DELETE statement conflicted with the REFERENCE constraint "FK_DataVals_ValsPrices". The conflict occurred in database "iomzcerttest", table "dbo.DataVals", column 'idValMainPrice'. The statement has been terminated. Запись не удаляется. Почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 07:50 |
|
Удаление строки в связанных таблицах
|
|||
---|---|---|---|
#18+
Strength Class Фото в прилагаемой картинке. Кстати, а зачем триггер, если уже есть каскадное удаление? И, если надо чистить "зависшие" записи, то это следует делать не вместо удаления, а после него. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 08:54 |
|
Удаление строки в связанных таблицах
|
|||
---|---|---|---|
#18+
Akina, Для первой таблицы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
Для второй таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 09:12 |
|
Удаление строки в связанных таблицах
|
|||
---|---|---|---|
#18+
Strength Class, У Вас перекрестные ссылки, таблицы ссылаются друг на друга. Таблица [dbo].[DataVals] ссылается на [dbo].[ValsPrices] Код: sql 1. 2.
Талица [dbo].[ValsPrices] ссылается на [dbo].[DataVals] Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 10:12 |
|
Удаление строки в связанных таблицах
|
|||
---|---|---|---|
#18+
PaulWist, Перекрестные ссылки удалены, но ошибка осталась та же. Первая таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60.
Вторая таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 08:57 |
|
Удаление строки в связанных таблицах
|
|||
---|---|---|---|
#18+
Strength Class, Смотрите, что делаете: 1. Удаляете из [dbo].[DataVals] Код: sql 1. 2. 3.
2. Срабатывает триггер [dbo].[DeleteTrigger] ON [dbo].[DataVals], в котором происходит удаление из [dbo].[DataVals] Код: sql 1.
НО, у таблицы [dbo].[ValsPrices] есть FK на [dbo].[DataVals] Код: sql 1. 2. 3.
Таким образом, при удалении из [dbo].[DataVals] в удаляемых записях есть значение поля [dbo].[DataVals].[idValPrice], на которое ссылается [dbo].[ValsPrices].[idValPrice], отсюда ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 10:16 |
|
Удаление строки в связанных таблицах
|
|||
---|---|---|---|
#18+
PaulWist, Т.е., я так понимаю, мне нужно удалить внешний ключ и оставить триггер, либо оставить внешний ключ, сделать каскадное удаление и удалить триггер? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 10:56 |
|
Удаление строки в связанных таблицах
|
|||
---|---|---|---|
#18+
Strength Class PaulWist, Т.е., я так понимаю, мне нужно удалить внешний ключ и оставить триггер, либо оставить внешний ключ, сделать каскадное удаление и удалить триггер? Ммм, всё зависит от бизнес логики, если удалить FK, то получим "висящие" ссылки. Вы лучше разберитесь, почему при удалении происходит такая ситуация, обычно так бывает, когда разработчик думает, что данные лежат определенным образом, а на самом деле это не так. PS В принципе, достаточно обNULLить ValsPrices.idValPrice на которые ссылается DataVals.idValMainPrice - это я рассказываю как не надо делать! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 11:59 |
|
|
start [/forum/topic.php?fid=46&fpage=26&tid=1684790]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 143ms |
0 / 0 |