целостность данных

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

целостность данных

Сообщение Dmitriy Solomnikov » 25.07.2006 (Вт) 9:37

Вот в этом топике:
http://bbs.vbstreets.ru/viewtopic.php?t=27068

мне помогли написать sql-запрос на вставку данных:
    INSERT INTO Контрагенты(Код_контрагента, Дата_начала_действия, Дата_конца_действия)
    (SELECT (SELECT COALESCE(MAX([Код_контрагента]),0) FROM Контрагенты), '12.12.1982','12.21.1982')

внутри которого находится подселект:
    SELECT COALESCE(MAX([Код_контрагента]),0) FROM Контрагенты


Фишка в том, что приложение многопользовательское и одновременно может выполняется несколько таких запросов. Как избежать того, что бы произошла вставка двух одинаковых значений? Ключи и уникальные индексы не подходят.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.07.2006 (Вт) 10:34

почему не подходят?
открывай транзакцию тогда

Код: Выделить всё
BEGIN TRAN

INSERT ....

IF (@@ERROR<>0)
  ROLLBACK TRAN

COMMIT TRAN

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 25.07.2006 (Вт) 10:45

Konst_One писал(а):почему не подходят?
Их там просто невозможно создать (уникальными).


открывай транзакцию тогда
Код: Выделить всё
BEGIN TRAN
INSERT ....
IF (@@ERROR<>0)
  ROLLBACK TRAN
COMMIT TRAN


Допустим пользователь П1 запустил транзакцию и пытается вставить данные. Пользователь П2 тоже пытается запустить транзакцию на вставку данных. В рамках обеих транзакций происходит выполнение SELECT MAX(...). Как будет вести себя сервер? Позволит он одновременно выполнять 2 транзакции на вставку или одну из них заблокирует?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.07.2006 (Вт) 10:50

допустит, если не нарушена целостность ключей и не противоречит установленным констрейнтам и триггерам и тп

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.07.2006 (Вт) 10:51

похоже тебе лучше продумать свою задачу более внимательно. особенно меня смущает MAX, что ты этим хочешь добиться?

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 25.07.2006 (Вт) 10:53

Konst_One писал(а):похоже тебе лучше продумать свою задачу более внимательно. особенно меня смущает MAX, что ты этим хочешь добиться?


MAX - это для того, чтобы найти код, которого еще нет. Этот столбец не является IDENTITY, ключом или уникальным индексом. Поэтому искать свободное значение приходится вручную.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.07.2006 (Вт) 11:17

имхо, это самое узкое место в твоей реализации

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.07.2006 (Вт) 11:20

я бы посоветовал сделать хранимую процедуру добавления нового контрагента, а в селект добавить READCOMMITTED хинт, чтобы исключить пересечение

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 25.07.2006 (Вт) 11:25

Konst_One писал(а):а в селект добавить READCOMMITTED хинт, чтобы исключить пересечение


Что-то не очень понял. Можно примерчик глянуть?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.07.2006 (Вт) 11:46

Код: Выделить всё
BEGIN TRANSACTION
SELECT au_lname FROM authors WITH (READCOMMITTED)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 25.07.2006 (Вт) 14:47

Dmitriy Solomnikov писал(а):MAX - это для того, чтобы найти код, которого еще нет. Этот столбец не является IDENTITY, ключом или уникальным индексом. Поэтому искать свободное значение приходится вручную.


А какая религия мешает сделать его IDENTITY???
И не пришлось бы искать свободное вручную...

Может лучше поправить?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 25.07.2006 (Вт) 15:00

Религия называется версионность.
Моя дверь всегда открыта, если она не закрыта.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.08.2006 (Ср) 13:09

И все равно непонятно, чем эта религия мешает.
В конце концов, кто мешает создать вспомогательную таблицу с IDENTITY и полем статуса и брать номера из нее?
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList