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

Откуда:
Сообщений: 72
Здравствуйте.
Есть следующая таблица:
create table Test
(
	Id uniqueidentifier default newid() primary key,
	Column1 timestamp,
	Column2 bigint,
	Column3 varchar(max)
)

Как можно в Column2 скопировать значение из Column1 при вставке?
Пробовал делать с помощью триггера:
create trigger Test_InsertTrigger
   on Test
   after insert
as
begin
    update Test
    set
	    Column2 = i.Column1
    from inserted i
    where i.Id = Test.Id
end

Но при обновлении обновляется и поле timestamp:
insert into test (Column3)
values ('Test'), ('Test1'), ('Test2'), ('Test3'), ('Test4')

select convert(bigint, Column1), Column2
from test

Как-то можно сделать значения полей Column1 и Column2 одинаковыми?
26 июл 12, 11:32    [12918453]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
Вот результат запроса:

Column1 Column2
---------------------
11356896 11356895
11356899 11356892
11356897 11356894
11356898 11356893
11356900 11356891
26 июл 12, 11:39    [12918509]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
Леша777
Guest
Добавить DEFAULT CONSTRAINT
26 июл 12, 11:46    [12918553]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
create table Test
(
	Id uniqueidentifier default newid() primary key,
	Column1 timestamp,
	Column2 as cast(Column1 as bigint),
	Column3 varchar(max)
);
26 июл 12, 11:47    [12918563]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
Леша777
Добавить DEFAULT CONSTRAINT

Какое?
26 июл 12, 11:48    [12918569]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
invm
create table Test
(
	Id uniqueidentifier default newid() primary key,
	Column1 timestamp,
	Column2 as cast(Column1 as bigint),
	Column3 varchar(max)
);


Спасибо.
26 июл 12, 11:49    [12918576]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
beb
Guest
а Вас устраивает, что теперь Column2 будет всегда вычисляться по Column1?
т.е. апдейтить его в будущем сможете, только меняя Column1
26 июл 12, 12:10    [12918733]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
Хотя мне этот способ не подходит. Есть еще ограничение - одинаковыми они должны быть только при вставке, а при изменении Column1 должна меняться, а Column2 - нет.
26 июл 12, 12:22    [12918807]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
beb
а Вас устраивает, что теперь Column2 будет всегда вычисляться по Column1?
т.е. апдейтить его в будущем сможете, только меняя Column1

Не подходит.
26 июл 12, 12:23    [12918818]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
DachNik
Хотя мне этот способ не подходит. Есть еще ограничение - одинаковыми они должны быть только при вставке, а при изменении Column1 должна меняться, а Column2 - нет.
Column2 задавайте в триггере на вставку.
26 июл 12, 12:32    [12918882]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
iap
Column2 задавайте в триггере на вставку.
Только вот при этом значение Column1 еще раз поменяется.
26 июл 12, 12:42    [12918983]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
iap
DachNik
Хотя мне этот способ не подходит. Есть еще ограничение - одинаковыми они должны быть только при вставке, а при изменении Column1 должна меняться, а Column2 - нет.
Column2 задавайте в триггере на вставку.

Вставляется NULL, видать в триггере на вставку значение поля Column1 еще не определено.
26 июл 12, 12:47    [12919010]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
Триггер INSTEAD OF INSERT имелось ввиду.
26 июл 12, 12:47    [12919017]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
DachNik
Триггер INSTEAD OF INSERT имелось ввиду.
Ну дык конечно!
Я и не предлагал INSTEAD OF INSERT.
Однако, AFTER INSERT тоже не годится, как подметил invm

Может, можно как-нибудь прикрутить @@DBTS или MIN_ACTIVE_ROWVERSION?
26 июл 12, 12:56    [12919091]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
DachNik
Есть еще ограничение - одинаковыми они должны быть только при вставке, а при изменении Column1 должна меняться, а Column2 - нет.
Может поделитесь, зачем вам это нужно? Ибо обеспечить такое можно если:
а) в таблицу всегда будет вставляться ровно одна запись;
б) столбец timestamp будет только в этой таблице.
Тогда в триггере instead of insert можно будет воспользоваться функцией @@DBTS. И то без гарантий.
26 июл 12, 12:59    [12919129]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Может, можно как-нибудь прикрутить @@DBTS или MIN_ACTIVE_ROWVERSION

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

Posted via ActualForum NNTP Server 1.5

26 июл 12, 13:08    [12919226]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
iap
DachNik
Триггер INSTEAD OF INSERT имелось ввиду.
Ну дык конечно!
Я и не предлагал INSTEAD OF INSERT.
Однако, AFTER INSERT тоже не годится, как подметил invm

Может, можно как-нибудь прикрутить @@DBTS или MIN_ACTIVE_ROWVERSION?


Пробовал прикрутить @@DBTS+1, но тогда при вставке строк > 1, у всех будет одно и тоже значение = @@DBTS+1. Если вставлять одну строку, то будет работать, да. Но мне нужно чтобы работало и для вставки множества строк сразу.
Еще пробовал вычислять порядковый номер строк таблицы inserted и прибавлять его:
alter trigger Test_InsertTrigger
   on Test
   after insert
as
begin
	declare @table table (RowNum bigint, Id uniqueidentifier)
	insert into @table
	select
		row_number() over (order by Column1),
		Id
	from inserted

    update Test
    set
	    Column2 = @@DBTS + t.RowNum
    from inserted i, @table t
    where i.Id = Test.Id and i.Id = t.Id
end      


Значения вставляются те же что и в поле Column1, но вразноброс:
Column1 Column2
----------------------
11357757 11357759
11357756 11357760
11357759 11357757
11357760 11357756
11357758 11357758
26 июл 12, 13:11    [12919245]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
invm
DachNik
Есть еще ограничение - одинаковыми они должны быть только при вставке, а при изменении Column1 должна меняться, а Column2 - нет.
Может поделитесь, зачем вам это нужно? Ибо обеспечить такое можно если:
а) в таблицу всегда будет вставляться ровно одна запись;
б) столбец timestamp будет только в этой таблице.
Тогда в триггере instead of insert можно будет воспользоваться функцией @@DBTS. И то без гарантий.

По этим полям отслеживаются изменения, определяется было поле вставлено или изменено.
26 июл 12, 13:13    [12919264]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
invm, Вы правильно сказали что нужно в instead of триггере использовать функцию @@DBTS.
Вот такой триггер вроде работает:
alter trigger Test_InsertTrigger
   on Test
   instead of insert
as
begin
	declare @table table (RowNum bigint, Id uniqueidentifier)
	insert into @table
	select
		row_number() over (order by Column1),
		Id
	from inserted

    insert into Test (Id, Column2, Column3)
    select
		i.Id,
	    @@DBTS + t.RowNum,
	    i.Column3
    from inserted i, @table t
    where i.Id = t.Id
end    


Результат:
Column1 Column2
-----------------------
11357762 11357762
11357765 11357765
11357764 11357764
11357763 11357763
11357761 11357761
26 июл 12, 13:22    [12919329]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
DachNik,

Воспользуйтесь лучше вариантом daw. Это будет гораздо правильнее и надежнее.
26 июл 12, 13:29    [12919380]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать значения поля timestamp  [new]
DachNik
Member

Откуда:
Сообщений: 72
Да этот способ ненадежен, на больших объемах такое совпадение уже не наблюдается.
26 июл 12, 13:40    [12919443]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить