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

Откуда:
Сообщений: 4
Доброго времени суток!

Пишу софтину для разового изменения базы (своего рода патч) для простых юзеров. Сам с базами сталкиваю впервые и сразу же напоролся на одну проблему. Делаю бэкап изменяемых таблиц:
SELECT * INTO MyTable_bakcup FROM MyTable
Новая таблица создается - все здорово. Но нужно в случае чего вернуть все как было:
Пытаюсь "дропнуть" таблицу, и тем же способом восстановить ее из бэкапа.
Не тут то было - грязно матерится и говорит, что в данной таблице присутствуют некие "Foreign key" и удалить ее нельзя...

В связи с этим несколько пара вопросов-просьб:
1) Корректно ли при наличии Foreign key в таблице делать ее бэкап описанным выше способом?
2) Как восстановить таблицу из бэкапа, если в ней есть Foreign key? Изменяю data type столбцов таблице, но в идеале, чтобы восстанавливалось всё - на будущее.
3) Корректен ли вообще такой способ бэкапа и если нет - то какой использовать?
4) В общем - что делать?

Работа скорее всего разовая, но несмотря на это я буду рад любым материалам (в идеале на русском) про эти самые Foreign key. Но и по причине того, что работа скорее всего разовая, я буду премного благодарен, если кто-нибудь подскажет уже готовое решение данной проблемы, помимо традиционных (курить мануалы(время...), юзать поиск(юзал) и гугл(знать бы что искать)).

Заранее благодарю!
22 ноя 10, 07:12    [9816496]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
А чем вас не устраивают штатные средства резервирования?
22 ноя 10, 07:15    [9816500]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
У тети Маши в классе 15 учеников.

Имеем таблицы "Класс.рук" и "Ученики". Надо обеспечить целостность данных, чтобы ни коим образом не получилось так, что есть ученики без класс.руков

Соответственно, создается FK (Foreign key) по которому ученики ссылаются на класс.руков. Что же происходит?

1. Нельзя добавить учеников, без указания класс.рука
2. Нельзя удалить класс.рука, не удалив учеников -- это то, что Вы пытаетесь сделать

Вы пытаетесь удалить "тетю Машу", а "ученики" ее получается "в подвисшем состоянии".

Я так понимаю БОЛ Вы не осилили или и не открывали, я уж не знаю какой из этих 2-х вариантов, поэтому вышенаписаное - вкратце и на пальцах суть процесса.
22 ноя 10, 07:23    [9816503]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Equilibrium Keeper,
Выполняйте все в одной транзакции с максимальным уровнем изоляции, если что не так, серевер сам откатит?

Equilibrium Keeper
В связи с этим несколько пара вопросов-просьб:
1) Корректно ли при наличии Foreign key в таблице делать ее бэкап описанным выше способом?
2) Как восстановить таблицу из бэкапа, если в ней есть Foreign key? Изменяю data type столбцов таблице, но в идеале, чтобы восстанавливалось всё - на будущее.
3) Корректен ли вообще такой способ бэкапа и если нет - то какой использовать?
4) В общем - что делать?

1) Не очень по нескольким причинам. Вот некоторые из них. Вы делаете просто копию данных. Целостность (которая как раз обеспечивается форенкеями) не обеспечена, соотв.если у вас идет работа с этой базой - данные могут отличаться в итоге. Если на таблице есть триггеры - селект инто по-моему минимально журналируема и данные опять могут испортится. Ну и т.д. Так что - имхо не лучший способ.
2) Мне кажется правильный путь уж если решили делать именно так был бы такой. В транзакции. Копировать таблицу. Заготовить скрипт который дропает все форен кеи. Заготовить который создает все форенкеи по этой таблице. Если есть триггеры - посмотреть не изменяют ли они данные в других таблица, если есть, тогда их тоже забекапить. После этого провести все необходимые манипуляции. В случае ошибки, удалить все форенкеи. Дропнуть таблицу. Таблицу бэкап переименовать в старое название, создать все форенкеи. Как-то так (может что-то и забыл конечно).
3) Как тут уже говорили, чем плох стандартный бекап?
Инструкции по созданию резервных копий и восстановлению из них (Transact-SQL)
4) Имхо, конечно если это разовая работа и с БД вы дальше работать не собираетесь - понимаю нежелание во что-то вникать, но лучше все-таки разобраться, чтобы не накосячить потом. Ну и забэкапьте все-таки все стандартными средствами, даже если решите делать свой вариант бэкапа =)
22 ноя 10, 09:54    [9816807]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Equilibrium Keeper
Member

Откуда:
Сообщений: 4
Всем ответившим - большое спасибо! Кудряшке - за объяснение на пальцах. :) Кто такой БОЛ - не знаю. :)

SomewhereSomehow
Так и делаю - использую одну транзакцию. Правда, тут суть уже не в падении во время работы, а в восстановлении оригинала, скажем, через неделю после этой самой работы.

1) Понял, как и подозревал.
2) К сожалению, очень сложно и в большей степени непонятно. Вернее - неясно, как это реализовать. Да и бэкап соседних таблиц не вариант, потому что изменения в этой откатить можно - не страшно. А вот в связанных... юзеры повесятся.
3) Ушел штудировать.
4) Сейчас почитаю про стандартный вариант - если понравится, сделаю. Если нет - откажусь от бэкапа, оставлю только транзакцию. В конце концов, там и так висит предупреждение с отказом от ответственности и воззванию к разуму. Надеюсь, поможет. :)

Ну, а что касается освоения - так или иначе придется. Просто сейчас нет времени этим заниматься. Думаю, под новый год засяду - разберу. :)

Еще раз всем огромное спасибо!
23 ноя 10, 03:53    [9822642]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Foreign key и как с ними... дружить  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 264
Я извиняюсь то что тема довольно таки старая, но у меня схожий вопрос:
Я прочитал:
автор

1. Нельзя добавить учеников, без указания класс.рука
2. Нельзя удалить класс.рука, не удалив учеников -- это то, что Вы пытаетесь сделать

Вы пытаетесь удалить "тетю Машу", а "ученики" ее получается "в подвисшем состоянии".


Как это будет выглядить на уровне заполнения, в коде sql, t-sql:
Если есть иерархический справочник абитуриентов где ни только есть ссылки на справочник класс.рука, но и справочник учеников ,номер класса, итд:

автор
intert into dbo.applicant (teacherID, StudentNameID, NumberID)

select teacherID, StudentNameID, NumberID FROM dbo.teachers, dbo.studentNames, dbo.classNumber WHERE dbo.teachers.Name = 'Иванова Катерина', dbo.studentNames.Name = 'Петров', dbo.classNumber.Count = '10A'



Я просто не очень близко знаком с sql поправте если неправильный ход мысли или есть ошибки.

foreign key должен хранить значение поля primary key таблицы на которую ссылается? как посмотреть что он правильный - ну т.е выяснить что с целостностью все впорядке?
17 сен 14, 11:22    [16584628]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dr.Hofmann
Как это будет выглядить на уровне заполнения, в коде sql, t-sql:

Никак.
foreign key - это проверка добавляемых/изменяемых значений.
А не проверка команды, которая пытается добавить/изменить значения.

Dr.Hofmann
foreign key должен хранить значение поля primary key таблицы на которую ссылается?

Да

Dr.Hofmann
как посмотреть что он правильный - ну т.е выяснить что с целостностью все впорядке?

foreign key не мождет быть создан, если значения полей неправильные.
И в дальнейшем foreign key предотвращает занесение неправильных значений
17 сен 14, 11:28    [16584660]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 264
автор
foreign key не мождет быть создан, если значения полей неправильные.
И в дальнейшем foreign key предотвращает занесение неправильных значений

ок!

автор
Никак.
foreign key - это проверка добавляемых/изменяемых значений.

Возможно не правильно выразился, другой вопрос данный sql код правельный для заполнения сразу нескольких таблиц?
insert applicant (teacherID, StudentNameID, NumberID, Rating)
select teacherID
          ,StudentNameID
          ,NumberID
FROM teachers
           ,studentNames
           ,classNumber
WHERE teachers.Name = 'Иванова Катерина'
and studentNames.Name = 'Петров'
and classNumber.Count = '10A' 

values Rating = '5';
17 сен 14, 11:46    [16584784]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dr.Hofmann
другой вопрос данный sql код правельный для заполнения сразу нескольких таблиц?

один insert может "заполнять" только одну таблицу

Для проверки синтаксиса в утилитах обычно есть специальная кнопка
Для проверки логики пишут проверочные тесты.

ЗЫ
Ваш запрос нарушает и синтаксис и логику.
17 сен 14, 11:53    [16584816]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
applicant - это представление что ли? Иначе как можно говорить о заполнении нескольких таблиц?
Можно заполнить несколько таблиц через представление в триггере INSTEAD OF INSERT этого представления.
17 сен 14, 12:13    [16584934]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 264
автор
ЗЫ
Ваш запрос нарушает и синтаксис и логику.

С синтаксисом я посмотрю ну а с логикой что не так?
Картинка с другого сайта.

Создаю две таблицы с одинаковыми primary key и другими атрибутами, если мне нужно сделать связь создаю foreign key И указываю что ссылаюсь на такое-то поле(primary key) такой-то таблицы на скрине Referenced Column, Referenced Table, и указываю что храниться оно будет в primary kye столбце той таблицы для которой создается foreign key.
Что не так? Что не понравилось?
17 сен 14, 12:19    [16584966]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dr.Hofmann
С синтаксисом я посмотрю ну а с логикой что не так?

Вы свой FROM и WHERE сами сочиняли и подсказал кто ?
17 сен 14, 12:21    [16584980]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
Dr.Hofmann
С синтаксисом я посмотрю ну а с логикой что не так?

Вы свой FROM и WHERE сами сочиняли и подсказал кто ?
Ещё интересно, как можно додуматься до
values Rating = '5';
17 сен 14, 12:25    [16584998]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 264
автор
Вы свой FROM и WHERE сами сочиняли и подсказал кто ?

Коллега из соседней комнаты но получается что он не совсем pro - честно говоря))

автор
Ещё интересно, как можно додуматься до
values Rating = '5';

Я только изучаю sql поэтому просьба не критиковать особо, а то я могу разозлиться))
Это косяк, я согласен какой ваш правильный вариант?
17 сен 14, 13:03    [16585190]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dr.Hofmann
Коллега из соседней комнаты но получается что он не совсем pro - честно говоря))

http://technet.microsoft.com/ru-ru/library/ms191517(v=sql.105).aspx

Dr.Hofmann
Это косяк, я согласен какой ваш правильный вариант?

Вот такой http://msdn.microsoft.com/ru-ru/library/ms174335.aspx
17 сен 14, 13:05    [16585204]     Ответить | Цитировать Сообщить модератору
 Re: Foreign key и как с ними... дружить  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 264
автор

Dr.Hofmann
Коллега из соседней комнаты но получается что он не совсем pro - честно говоря))

http://technet.microsoft.com/ru-ru/library/ms191517(v=sql.105).aspx

Dr.Hofmann
Это косяк, я согласен какой ваш правильный вариант?

Вот такой http://msdn.microsoft.com/ru-ru/library/ms174335.aspx

Спасибо комрады начинаю разбирать вот что сделал и поправил:
Картинка с другого сайта.

Дописал insert для вставки из нескольких таблиц, если что может кому-то понадобиться:
GO
insert into dbo.applicant (PersonID, TeacherID, ClassID, Behavior)
select pr.PersonID
      ,th.TeacherID
      ,cl.ClassID
      , 'GOOD'
from dbo.Persons pr
 INNER JOIN dbo.Teachers th
   ON th.Name = 'Galina Petrova'
 INNER JOIN dbo.Classes cl
   ON cl.NUMBER = 8
WHERE pr.Name = 'Dmitri'
AND pr.SecondName = 'Kuznetsov'
18 сен 14, 14:57    [16590941]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить