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

Откуда:
Сообщений: 657
Есть сервер
В нем несолько баз
Как сделать поле ID уникальных (увеличивающихся на 1) значений.
т.е. я создаю таблицу в базе на этом сервере и говорю- Default value = то то
и когда у меня будет добавляться запись в эту таблицу то автоматом будет подставляться значение уникальное для всех таблиц во всех базах.
Мне это необходимо чтобы в последсвии можно было бы восстановить хронологию поступления записей в разные таблицы в разных базах на одном сервере.
20 дек 04, 18:06    [1194637]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
GUID (в MSSQL представленный типом uniqueidentifier) и функция newid().
20 дек 04, 18:15    [1194678]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Alexander Popov
Member

Откуда:
Сообщений: 663
может timestamp сможет помочь?
20 дек 04, 18:35    [1194747]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
GUID вряд ли пойдет
Он уникальный но я не уверен что последовательно повышающийся.
мне надо использовать конструкцйию вида
Order by MyId для получения последовательности записанных строк в разные таблици в разных базах.
А Timestamp их неудобно использовать для визуального контроля. там байты неудобочитаемые.
Есть сервер
В нем 2 разные базы. А и Б
В них много табличек.
Оператор вася добавляет в базу А
Оператор петя добавляет в базу Б
мне нужно выяснить хронологию добавления записей в эти таблички.
P.S. Ну это не совсем операторы, это проги, так что записей может добавляться сотнями в секунду.
20 дек 04, 19:13    [1194849]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Alexander_fx
GUID вряд ли пойдет
Он уникальный но я не уверен что последовательно повышающийся.

Правильно не уверены. Ну мало ли, может, вам было бы достаточно уникальности. Про хронологию ведь изначально речь не шла.

Alexander_fx
А Timestamp их неудобно использовать для визуального контроля. там байты неудобочитаемые.

Так никто вас не заставляет читать их именно в том виде, как они записаны. Можно преобразовывать к целому на клиенте или вообще вычисляемое поле добавить, которое будет просто приводить binary к int. То есть можно преобразовывать и на сервере.
20 дек 04, 19:28    [1194870]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Taffy
Member

Откуда:
Сообщений: 20501
В одной из таблиц делаете служебную таблицу со счетчиком
Пишете хранимую процедуру, которая наращивает счетчик и выдает текущее значение. И при вставке строк во все таблицы всех баз, для определения значения ID, обращаетесь к этой процедуре.
20 дек 04, 19:40    [1194894]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
Блин
timestamp is a data type that exposes automatically generated binary numbers, which are guaranteed to be unique within a database. timestamp is used typically as a mechanism for version-stamping table rows. The storage size is 8 bytes.

Я так понимаю что уникальность распространяется только на 1 базу а мне нужна уникальность на сервер.

Подскажите - как сделать функцию, доступную из всех баз сервера, которая возвращала бы значение, которое автоматом увиличивается на 1 при каждом вызове данной функции. И можно ли добавлять эту функцию в Default Value?
20 дек 04, 19:44    [1194908]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Taffy
Member

Откуда:
Сообщений: 20501
Функцию - никак. Вам там понадобится update, а это в хранимой процеуре. См выше
20 дек 04, 20:17    [1194960]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
А можно ли будет эту хранимую процедуру подставлять в виде Default Value? и если да то как
20 дек 04, 20:53    [1195003]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
sparrow
Member

Откуда: Россия, Красноярск.
Сообщений: 21759
виде Default Value - нельзя
а сама процедура здесь: https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=12200&hl=#53029
21 дек 04, 06:04    [1195275]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
aleks2
Guest
>>мне нужно выяснить хронологию добавления записей в эти таблички.

Для этого человечество придумало календарь... давно.

datetime DEFAULT getdate() - обеспечивает хронологию.
и
uniqueidentifier DEFAULT newid() - обеспечивает уникальность.

Вот она - сладкая парочка.
-----------------------
Нат смысла выдумывать велосипед.
21 дек 04, 08:10    [1195349]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
>>>>Для этого человечество придумало календарь... давно.
Одно дело придумать, другое использовать.

datetime DEFAULT getdate() - обеспечивает хронологию.

И как это скажите на милость это обеспечивает хронологию????
for i=1 to 100
Insert into log (val) values (" & i & ")
next i
Так вот с одинаковым временем по 30-40 записей одновременно

а про NewId - как это по этой штуке вообще сортировать можно????

>>>>>Нат смысла выдумывать велосипед.
Самому противно, но приходиться.
21 дек 04, 11:06    [1195747]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Возможно, вы неправильно представляете себе решение вашей задачи, и поэтому оно вам кажется сложным, неудобным и вообще дурацким.

Давайте начнем сначала. Почему вам не хватает уникальности и зачем обязательное нарастание некоего счетчика в пределах сервера на единицу?

Может быть, как раз это лишнее условие в постановке, если хорошо подумать?
21 дек 04, 11:56    [1195964]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
aleks2
Guest
Calling Extended Stored Procedures from Functions
Functions that call extended stored procedures are nondeterministic because the extended stored procedures can cause side effects on the database. Side effects are changes to a global state of the database, such as an update to a table, or to an external resource, such as a file or the network (for example, modifying a file or sending an e-mail message). You should not rely on returning a consistent result set when executing an extended stored procedure from a user-defined function. User-defined functions that create side effects on the database are not recommended.

When called from inside a function, the extended stored procedure cannot return result sets to the client. Any Open Data Services API that returns result sets to the client will have a return code of FAIL.

The extended stored procedure can connect back to SQL Server; however, the procedure cannot join the same transaction as the original function that invoked the extended stored procedure.

Similar to invocations from a batch or stored procedure, the extended stored procedure is executed in the context of the Microsoft Windows® security account under which SQL Server is running. The owner of the extended stored procedure should consider this when granting permissions to other users to execute the procedure.

©1988-2002 Microsoft Corporation. All Rights Reserved.
21 дек 04, 13:08    [1196394]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2Alexander_fx
2 колонки одна getdate()
другая newid()

З.Ы. интересно... чей енто синткс, for?)

для спящего время бодрствования равносильно сну
21 дек 04, 13:09    [1196401]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
GreenSunrise
Возможно, вы неправильно представляете себе решение вашей задачи, и поэтому оно вам кажется сложным, неудобным и вообще дурацким.

Давайте начнем сначала. Почему вам не хватает уникальности и зачем обязательное нарастание некоего счетчика в пределах сервера на единицу?

Может быть, как раз это лишнее условие в постановке, если хорошо подумать?


Ок

Есть 1 Сервер расположен на 1 машине.
Есть Несколько баз на этом сервере ( предположим 2)
В каждой базе есть несколько таблиц.
Есть несколько программ которые пишут во все эти таблицы.
Допустим прога 1 пишет данные в таблицу Т1 базы Б1
Допустим прога 2 пишет данные в таблицу Т2 базы Б2
Данные просто вставляются в таблицы.
Мне необходимо восстановить хронологию поступления записей в эти базы.
Но траблс в том что данные могут поступать с различной скоростью.
Иногда 1 в час иногда 100 в сек. и точности Getdate() не хватает.
(простой пример с циклом показывает что данных с одинаковым временем может писаться по несколько десятков.)
У меня сейчас есть в каждой таблице
Id int ident
InTime datetime def Getdate()
так вот как получить данные из различных таблиц в разных базах в порядке поступления их в эти базы? Для этого и нужен увеличивающийся счетчик, чтобы можно было отсортировать значения в нужном порядке
В принципе нужен ID Ident но не для одной таблицы а для всех баз сервера.
21 дек 04, 13:49    [1196613]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Ve
Member

Откуда:
Сообщений: 7
select 'tab1',InTime
from table1
Union All
select 'tab2', Intime
from table2
Union All
select 'tab3', Intime
from table3
Order by InTime
21 дек 04, 14:46    [1196922]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Ve
Member

Откуда:
Сообщений: 7
select 'tab1',InTime
from [Db1Name]..table1
Union All
select 'tab2', Intime
from [Db1Name]..table2
Union all
select 'tab1',InTime
from [Db2Name]..table1
Union All
select 'tab2', Intime
from [Db2Name]..table2

Order by InTime
21 дек 04, 14:52    [1196952]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
есть мысль сделать триггеры на встаку, типа
create trigger [tr] on [Table1]
instead of insert
as
begin
declare @maxcurr bigint,@max bigint
set @max=-1
set @maxcurr = (select top 1 [id] from [DB1].[dbo].[Table1] order by [id] desc)
if @max<@maxcurr set @max=@maxcurr
set @maxcurr = (select top 1 [id] from [DB1].[dbo].[Table2] order by [id] desc)
if @max<@maxcurr set @max=@maxcurr
...
set @max=@max+1
insert into Table1(id,....)
 select @max,... from inserted
end
1)только для вставки по одной строке
2)даже в совокупности с индексом на таблицах по id order by desc будет всё это не супер быстро
21 дек 04, 15:06    [1197020]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Ага. Вот теперь понятно, что вам нужно. К сожалению, встроенных средств нет.

Может быть, сделать одну базу-приемник? Обе программы будут сливать туда сырые данные, в этой базе использовать timestamp, а потом раскидывать нужные данные по разным базам стандартными средствами (DTS/репликация/триггеры/...)?

В принципе то, что вы хотите, не слишком укладывается в понятие "база" в рамках сервера. В одной базе существуют данные, относящиеся к одной предметной области/проекту/самодостаточному решению. Все другие - независимы и от нее, и от других баз. Потому и стандартных средств нет для сквозной нумерации. Если данные связаны друг с другом, то для них нужна общая база.
21 дек 04, 15:16    [1197067]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
guestttt
Guest
The only way is

aleks2
Calling Extended Stored Procedures from Functions
Functions that call extended stored procedures are nondeterministic because the extended stored procedures can cause side effects on the database. Side effects are changes to a global state of the database, such as an update to a table, or to an external resource, such as a file or the network (for example, modifying a file or sending an e-mail message). You should not rely on returning a consistent result set when executing an extended stored procedure from a user-defined function. User-defined functions that create side effects on the database are not recommended.

When called from inside a function, the extended stored procedure cannot return result sets to the client. Any Open Data Services API that returns result sets to the client will have a return code of FAIL.

The extended stored procedure can connect back to SQL Server; however, the procedure cannot join the same transaction as the original function that invoked the extended stored procedure.

Similar to invocations from a batch or stored procedure, the extended stored procedure is executed in the context of the Microsoft Windows® security account under which SQL Server is running. The owner of the extended stored procedure should consider this when granting permissions to other users to execute the procedure.

©1988-2002 Microsoft Corporation. All Rights Reserved.

-----------------------------
Ннн...да, любят же некоторые усложнять себе жизнь.
21 дек 04, 15:48    [1197260]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
2guestttt: сочетание цитаты про extended procs и "любят же некоторые усложнять себе жизнь" что означает? Что вы "за" использование ESPs в данном случае или же как раз "против" и считаете это усложнением?

Ну и насчет "The only way is" позвольте не согласиться.
21 дек 04, 15:54    [1197296]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
В принципе нужен ID Ident но не для одной таблицы а для всех баз сервера.
Ну может тогда как-нибудь так?
use tempdb
if object_id('t1') is not null drop table t1
if object_id('mylog') is not null drop table mylog
go
create table mylog(ord int identity, tab sysname, xid int)
go
create table t1(id int identity,InTime datetime default(getdate()),xval int)
go
create trigger tI_t1 on t1
for insert as
 insert into tempdb.dbo.mylog(xid,tab) select id,'t1' from inserted
go
use pubs
go
create table t2(id int identity,InTime datetime default(getdate()),xval int)
go
create trigger tI_t2 on t2
for insert as
 insert into tempdb.dbo.mylog(xid,tab) select id,'t2' from inserted
go
declare @i int
set @i=1
while @i<=100 begin
	insert into tempdb.dbo.t1(xval) values(@i)
	insert into pubs.dbo.t2(xval) values(@i)
	set set @i=@i+1
end
select l.*,isnull(t1.InTime,t2.InTime) as InTime
from tempdb.dbo.mylog l 
	left join tempdb.dbo.t1 t1 on (l.xid=t1.id and l.tab='t1')
	left join pubs.dbo.t2 t2 on (l.xid=t2.id and l.tab='t2')
order by ord
drop table tempdb.dbo.t1,tempdb.dbo.mylog,pubs.dbo.t2
21 дек 04, 15:55    [1197304]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Сначала Обособливают данные по разным БД, а потом героически хотят с ними работать вместе и в реальном времени .
21 дек 04, 16:00    [1197338]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать свой счетчик?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Пиши сначала в одну БД, а затем раскидывай по разным (чтобы начальство не заметило :))
21 дек 04, 16:07    [1197380]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить