Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
Народ,
Для формирования уникального номера локумента, использую процедуру на сервере, котороя читает обновленное значение на 1 из поля в таблице и возвращаю его в переменную.
Процедура выглядит вот так:

CREATE PROCEDURE dbo.LastInvoice
@newNrOrders numeric(10)=0 OUTPUT with recompile
AS
DECLARE @xNewOrder Numeric(10)
Begin
select @xnewOrder = LastInvoiceNr + 1 FROM Common
update common SET LastInvoiceNr = @xnewOrder
select @newNrOrders = @xnewOrder
END
RETURN @newNrOrders

Как такого рода процесс организуется на сервере чтобы в момент чтения занчения из поля LastInvoiceNr из таблицы Common
в этот момент времени еще какой-то клиентский запрос одновременно его не считал, то есть чтобы обеспечить уникальность номера для разных документов? Возможно нужно применить блокировку записи.. Кто подскажет как корректно реализуется этот процесс? Всем спасибо.
4 фев 11, 15:08    [10184770]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
iljy
Member

Откуда:
Сообщений: 8711
Valerii,

CREATE PROCEDURE dbo.LastInvoice
   @newNrOrders numeric(10) OUTPUT
AS 
	update common SET @newNrOrders=LastInvoiceNr += 1
Но вообще это не очень хороший путь - с блокировками может быть много проблем. А чем просто IDENTITY не устраивает?
4 фев 11, 15:23    [10184871]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
iljy
Valerii,

CREATE PROCEDURE dbo.LastInvoice
   @newNrOrders numeric(10) OUTPUT
AS 
	update common SET @newNrOrders=LastInvoiceNr += 1
Но вообще это не очень хороший путь - с блокировками может быть много проблем. А чем просто IDENTITY не устраивает?


Какие проблемы? Этот процес минимальный и занимает очень мало времени и блокирует одну запись в таблице с одной записью.
Identity - это вставлять запись, запоминать и прибивать потом 3 процесса, которые по-моему мнению гораздо ресурсоемче. Или я не правильно что-то понимаю?
В фоксе есть блокировка записи и время ожидания SET REPROCESS, а вот как в SQL Server это реализуется мне непонятно.
Буду признателен за конкретный пример.
4 фев 11, 15:35    [10184954]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
iljy
Valerii,

CREATE PROCEDURE dbo.LastInvoice
   @newNrOrders numeric(10) OUTPUT
AS 
	update common SET @newNrOrders=LastInvoiceNr += 1
Но вообще это не очень хороший путь - с блокировками может быть много проблем. А чем просто IDENTITY не устраивает?


IDENTITY это кода один документ - одна запись, а когда в документе несколько или вааще море записей, и каждый док. должен быть идентифицирован уникально по номеру, вот для этого и нужен генератор уникальных номеров.
4 фев 11, 15:39    [10184989]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Glory
Member

Откуда:
Сообщений: 104751
Valerii

Какие проблемы? Этот процес минимальный и занимает очень мало времени и блокирует одну запись в таблице с одной записью.
Identity - это вставлять запись, запоминать и прибивать потом 3 процесса, которые по-моему мнению гораздо ресурсоемче. Или я не правильно что-то понимаю?

Зачем прибивать то ? Сразу в целевой таблице поле Identity
4 фев 11, 15:43    [10185019]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Glory
Member

Откуда:
Сообщений: 104751
Valerii
В фоксе есть блокировка записи и время ожидания SET REPROCESS, а вот как в SQL Server это реализуется мне непонятно.
Буду признателен за конкретный пример.

Вы хотите эмулировать на MSSQL механизм блокировок Foxpro ?
4 фев 11, 15:44    [10185028]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1578
Valerii
Какие проблемы? Этот процес минимальный и занимает очень мало времени и блокирует одну запись в таблице с одной записью.
Вы настолько хорошо знаете механизм работы севрера для подобных заявлений?
Identity - это вставлять запись, запоминать и прибивать потом 3 процесса, которые по-моему мнению гораздо ресурсоемче.
Занятия ерундой всегда ресурсоемкое. Кривости проектирования архитектуры на волнуют сервер.
Или я не правильно что-то понимаю?
Очень на это похоже.
В фоксе есть блокировка записи и время ожидания SET REPROCESS, а вот как в SQL Server это реализуется мне непонятно.
Буду признателен за конкретный пример.
Конкретный пример ручного управления блокировками в стиле фокса? И не мечтайте. Это совершенно другая система.
4 фев 11, 15:51    [10185086]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
Glory
Valerii
В фоксе есть блокировка записи и время ожидания SET REPROCESS, а вот как в SQL Server это реализуется мне непонятно.
Буду признателен за конкретный пример.

Вы хотите эмулировать на MSSQL механизм блокировок Foxpro ?

Есть какой-то другой механизм получения уникального номера, который используется при сохранении документов содержащих несколько записей? Если есть - подскажите.
4 фев 11, 15:51    [10185088]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Glory
Member

Откуда:
Сообщений: 104751
Valerii
Glory
пропущено...

Вы хотите эмулировать на MSSQL механизм блокировок Foxpro ?

Есть какой-то другой механизм получения уникального номера, который используется при сохранении документов содержащих несколько записей? Если есть - подскажите.

А какая проблема в использовании identity при "сохранении документов содержащих несколько записей" ?
4 фев 11, 15:54    [10185112]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
Glory
Valerii
пропущено...

Есть какой-то другой механизм получения уникального номера, который используется при сохранении документов содержащих несколько записей? Если есть - подскажите.

А какая проблема в использовании identity при "сохранении документов содержащих несколько записей" ?


Мне нужно сохранить к примеру заказ, в который вошло несколько товаров, под конкретным номером:
К примеру:
order_number Id_Item Qnty price
x 0001 3 200
x 0901 2 100
x 0908 10 15


Так вот этим х-ом должно быть нечно, что объденит эти 3 покупки под одним номером. Я не хочу иметь еще одну таблицу чтобы добавлять в нее одну запись в которой и будет присваиваться значение переменной х в качестве уникального номера.
4 фев 11, 16:04    [10185191]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Glory
Member

Откуда:
Сообщений: 104751
Valerii
Я не хочу иметь еще одну таблицу чтобы добавлять в нее одну запись в которой и будет присваиваться значение переменной х в качестве уникального номера.

Почему ? Нормальное решение, которое позволит легко получать и оперировать номером
4 фев 11, 16:09    [10185239]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
_djХомяГ
Guest
Обычно строки покупок так или иначе "входят" в некую другую сущность - а ля журнал (заголовок накладной) и и соответственно ему (заголовку) и можно присвоить некий Identity номер
4 фев 11, 16:10    [10185248]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
iljy
Member

Откуда:
Сообщений: 8711
Valerii,

а очень зря. Это самое правильное решение - в родительской таблице сохраняется инфа, относящаяся к заказу в целом (типа даты, покупателя, адреса доставки и т.д.).
4 фев 11, 16:10    [10185253]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
iljy
Valerii,

а очень зря. Это самое правильное решение - в родительской таблице сохраняется инфа, относящаяся к заказу в целом (типа даты, покупателя, адреса доставки и т.д.).


было таое но отказался я от такой схемы. Но вопрос - почему блокировки плохой вариант. Про взаимоблокировки читал, но тут этого по логике не должно быть?
4 фев 11, 16:21    [10185335]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
iljy
Member

Откуда:
Сообщений: 8711
Valerii,

да потому, что у вас эта маленькая таблица с одной записью может блокироваться в большой транзакции. Соответственно остальные транзакции будут ждать. Тогда уж сделайте так
create table common (LastInvoiceNr numeric(10) identity primary key)
go
CREATE PROCEDURE dbo.LastInvoice
   @newNrOrders numeric(10) OUTPUT
AS
    insert common default values
    set @newNrOrders = SCOPE_IDENTITY()
    delete common
4 фев 11, 16:36    [10185461]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
iljy
Member

Откуда:
Сообщений: 8711
Valerii,

а почему собственно отказались? Зачем вам понадобилась денормализация?
4 фев 11, 16:38    [10185476]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
iljy
Valerii,

а почему собственно отказались? Зачем вам понадобилась денормализация?

Конкретный пример:
Кассовый терминал, продажи идущие через сканер, набирается счет, при расчете, формируется чек, не суммарно - а по наименованию, фискальный терминал подбивает сумму и все.
Зачем еще дополнительные таблицы для этого процесса? Но конкретный счет должен быть сохранен и как-то идентифицирован, чтобы было понятно - что это отдельный покупатель и что ему соотвтествет определенный чек фискального терминала.
При сканнировании товара происходит проверка стока, отработка мерчендайзинга и прочие нюансы...
4 фев 11, 16:44    [10185523]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
[quot Valerii]
iljy
Valerii,

а почему собственно отказались? Зачем вам понадобилась денормализация?

да, и самое главное никакой денормализацией тут и не пахнет ..
4 фев 11, 16:45    [10185532]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Glory
Member

Откуда:
Сообщений: 104751
Valerii

да, и самое главное никакой денормализацией тут и не пахнет ..

И какой же нормальной форме отвечает такая ваша таблица ?
4 фев 11, 16:46    [10185540]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
iljy
Member

Откуда:
Сообщений: 8711
Valerii
да, и самое главное никакой денормализацией тут и не пахнет ..

Ну да, ну да. А как насчет даты чека? Номера терминала? Применяемых скидочных и прочих карточек?
4 фев 11, 16:52    [10185586]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
iljy
Valerii
да, и самое главное никакой денормализацией тут и не пахнет ..

Ну да, ну да. А как насчет даты чека? Номера терминала? Применяемых скидочных и прочих карточек?

Дата и время в чеке по конкретной позиции, цена - с учетом скидки, уценки, признак у каждой покупки свой. Так что не так все плохо.
4 фев 11, 17:05    [10185696]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Valerii
Member

Откуда:
Сообщений: 749
Valerii
iljy
пропущено...

Ну да, ну да. А как насчет даты чека? Номера терминала? Применяемых скидочных и прочих карточек?

Дата и время в чеке по конкретной позиции, цена - с учетом скидки, уценки, признак у каждой покупки свой. Так что не так все плохо.


Саое гланое - мы отошли от вопроса - как корректно выствит временную блокировку на запись?
4 фев 11, 17:05    [10185701]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Valerii
iljy
Valerii,

а почему собственно отказались? Зачем вам понадобилась денормализация?

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

Понятия "счёт", "чек" есть, а соответствующей таблицы и записей нет.

Это не только усложняет (а не упрощает, как вы думаете) разработку и сопровождение приложения, но и делает систему менее производительной, потому что каждый раз в тех случаях, когда понадобятся эти бизнес-сущности, вам их придётся вычислять.
4 фев 11, 17:06    [10185706]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Valerii
iljy
Ну да, ну да. А как насчет даты чека? Номера терминала? Применяемых скидочных и прочих карточек?

Дата и время в чеке по конкретной позиции, цена - с учетом скидки, уценки, признак у каждой покупки свой. Так что не так все плохо.
Точно, а полученную сумму, сдачу, код оплаты по кредитке, скидку на общую сумму покупки, фамилию продавца можно раскидать по позициям!
4 фев 11, 17:12    [10185753]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать счетчик уникальных значений  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1578
Valerii
Valerii
пропущено...

Дата и время в чеке по конкретной позиции, цена - с учетом скидки, уценки, признак у каждой покупки свой. Так что не так все плохо.


Саое гланое - мы отошли от вопроса - как корректно выствит временную блокировку на запись?
Самое главное, что Вы до сих пор не поняли ошибюок в проектировании базы данных. Ибо именно этими ошибками диктуется необходимость ручной блокировки записи. Вам предлагают решения без необходимости в ручных блокировках.
4 фев 11, 17:13    [10185763]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить