×

Каскадирование в MS SQL

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Итак, задачка. Возможно, детская, но всё же мы все начинали.

Имеется БД, в которой хранится граф. Таблица с вершинами и таблица с дугами, где имеется пара полей — внешних ключей к первой таблице, хранящих вершины, которые соединяет дуга. Проблема в том, что при попытке настройки каскадирования для удаления БД выдает ошибку о том, что возникает цикл. Как можно бороться с этой проблемой?

Еще раз:

таблица Nodes:

-NodeID

таблица Edges:

-SourceID

-DestinationID

Оба поля второй таблицы ссылаются на поле первой. Требуется автоматически удалять дуги при удалении вершины.

Буду очень благодарен за ответы.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Собственно, как и обещал, отписываюсь. Переклепал. Полет нормальный. Спс за новодки.

PomAH4uK, На счет хранимых процедур и линк. Пошел, проверил, таки да! Спасибо за наводку. Сейчас попробую преклепать БД на обеспечение целостности через хранимые процедуры. Отпишусь о результате.

Да какой драгоценное время у студента. Программлю по фану:)
А на счет linq поищи материал linq to sql.
В кратце как это работает: Создается класс-сущность, где все что относится к БД отмечается атрибутами, создается объект (местный аналог SqlConnection), из которого извлекается коллекция наших сущностей. Дальше уже мы линком вытягиваем то что нужно из таблицы. На самом деле данные кочуют из БД не в момент извлечения коллекции из DataContext (тот самый промежуточный объект), а в момент линк-запроса к коллекции. SQL выражения при этом генерируются автоматически. Вот.

Из материала азы упоминает Троелсен в гнигах по C# 3 и старше, посерьезней есть Pro LINQ: Language Integrated Query in C# 2008 Joseph C. Rattz, Jr. Если интересно, напиши в скайп (в профиле), скину ебуки (тільки англомовні).

Использовать хранимые процедуры мешает перспектива работать с БД через linq to sql.

З Linq to SQL можете використовувати збережувальні процедури.

LINQ to SQL якщо я не помиляюсь не позволяэ витягувати дані з “зациклюванням”, було б цікаво почути зворотнє, або рішення цього без БД процедур.

Насколько мне известно linq оперирует с объектами в памяти, типа DataTable или List...и он вроде делает всякого рода выборки, и ничего не удаляет...
Может, и заменяется — мне то неизвестно...Что можно както байндить linq-инструкции напрямую к сущностям бд?
> ЗЫ: Поумничали, проблему не решили.

Это, типа, ктото чтото Вам должен и только тратит в пустую Ваше драгоценное время?))

Ну в этом конкретном случае триггер как раз то что надо, ибо единственный выход бороться с висячими строками в таком случае — запланировать скрипт очитски. (единственный по крайней мере в моем поле зрения) С хранимыми процедурами мы получим те же яйца, только в профиль. Без них наш код запускает СУБД, с ними — тот же код запускается ручками. Кроме того, триггеры позволят работать через linq, потому за них и ухватился.
Что касается Data Modifier Framework, если я правильно понял идеологию, то он полностью заменяется linq’ом. Я прав?
ЗЫ: Поумничали, проблему не решили.
Давайте ее же, родимую, переформулируем. Хочется сохранить ограничения внешних ключей, которые пришлось отключить при использовании триггера. Использовать хранимые процедуры мешает перспектива работать с БД через linq to sql.

Ищется хитрый способ сэмулировать FK либо обойтись без триггера.

Я тригеры вообще обхожу десятой дорогой — «чрезмерная оптимизация — корень всех зол» — наделаешь кучу тригеров и БД «живет своей жизнью». Все телодвижения делаю через хранимые процедуры и DataAdapter (в случае C#). Это дает возможность получать, например, данные в OLAP-виде и делать вспомогательные подчистки как в ситуации с ребрами графа. Т.е. в логике работаю со структурами, с которыми удобней работать, а в базе храни хоть 5ую нормальную форму:).

Для этого у меня есть свой набор классов, который вбирает в себя всю рутину с тайпингом. В случае связки C#

nMS SQL Server 2005 можешь скачать здесь, чтобы понять идею, www.codeproject.com/...rFramework.aspx
Еще есть какие-то инструменты на основе XML, которые генерят классы, в которые просто вписываешь нужные имена хранимых процедур,...но мне както еще не попадался нормальный материал, чтобы въехать в эту тему (я имею ввиду) потом осознанно править весь этот сгенеренный код. Если разберешься — поделись.

Коротко: используй хранимые процедуры. Это позволит сохранять управляемость. А тригеры уже на правах сохранения совместимости.

Итак, идем дальше, с триггером прекрасно работает, но пришлось убрать «Enforce Foreign key constraint» в свойствах FK.
Скрин ошибки

Сделать это ограничение на триггерах себе дороже. Есть варианты или лучше следить за этим из своей программы?

Спасибо большое, заодно и триггеры подучу.

— создать тригер, который изничтожает все ребра, относящиеся к удаляемым вершинам:
CREATE
—ALTER
TRIGGER trg_d_node_on_delete_cascade ON [Nodes] FOR DELETE
AS
BEGIN
DELETE FROM [Edges]
FROM
[Edges] AS ed
JOIN
deleted AS sn ON ed.SourceID = sn.NodeID
DELETE FROM [Edges]
FROM
[Edges] AS ed
JOIN
deleted AS dn ON ed.DestinationID = dn.NodeID
END
GO
Доп ресурсы:

msdn.microsoft.com/...ibrary/aa902684 (SQL.80).aspx

Используйте триггеры.

Підписатись на коментарі