Максим Волков (mwolf_) wrote,
Максим Волков
mwolf_

Мой DB2 SQL сервер окупировали мозговые слизни

Чо делать?

На моей памяти это первый случай нападения на механический объект? и я чё то очкую теряюсь



Итак, сервер - Database server = DB2/LINUXX8664 8.2.9,
есть 2 таблицы Author и Person. Автор ссылается на Персону по полю person_id.
select COUNT(*) from author a --821
select COUNT(*) from person p --196
В комментариях после запроса - количество выданных строк или значение каунта.

Я отключаю внешний ключ и затем снова включаю его (я не знаю в каком состоянии был ключ до моих действий)
 ALTER TABLE AUTHOR ALTER FOREIGN KEY SQL050915213038020 NOT ENFORCED
 ALTER TABLE AUTHOR ALTER FOREIGN KEY SQL050915213038020 ENFORCED
На включении лезет ошибка, что Автор ссылается на Персон, которых нет.

И я полез проверять
select COUNT(*) from author a LEFT outer JOIN person p ON a.PERSON_ID = p.person_id WHERE p.person_id IS NULL -- 0
Ух, ты - подумал я. - Нет несоответствий!
А давай-ка посмотрим на значения и тут началось:
select *        from author a LEFT outer JOIN person p ON a.PERSON_ID = p.person_id -- 8 !!!!!!!!!!

select COUNT(*) from author a LEFT outer JOIN person p ON a.PERSON_ID = p.person_id -- 821!!!
Как такое может быть?!?!?!

С несовпадающими значениями что-то несложилось, давай посмотрим со совпадающими
select *        from author a, person p WHERE a.PERSON_ID = p.person_id -- 8

select COUNT(*) from author a, person p WHERE a.PERSON_ID = p.person_id -- 821

Лефт джоины не работают, вернёмся к старым добрым подзапросам
select * from author a WHERE a.PERSON_ID NOT IN (SELECT p.person_id FROM person p) --813

select * from author a WHERE a.PERSON_ID IN (SELECT p.person_id FROM person p) --821

Далее начались извращения с бубном:
select (select PERSON_ID from person p WHERE a.PERSON_ID = p.person_id) as pers,a.* from author a 
Этот запрос выдал, что в pers большинство значение NULL (кроме 8-ми)!!!
То есть в Author.person_id находятся значения такие значения, которіх нет в Person.person_id.
Я взял на пробу пару таких значений и действительно, таких значений в Персон нет.

Теперь вопросы:
Как может существовать такой внешний ключ, который ничего не ограничевает?
Как посмотреть состояние внешнего ключа? Может он и исходной БД отключён.
Что происходит с запросами? Я не понимаю их работу
Tags: db2, глюки, текущее
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment