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

Откуда:
Сообщений: 85
Смущает, что запись изменяется 2 раза.

CREATE trigger DocIn_History_AfterUpdate on dbo.DocIN
for update
as
begin
    DECLARE @CurrentDate DateTime
    SET @CurrentDate = getdate()
    UPDATE DocIN
    SET DateLastModified = @CurrentDate
    FROM DocIN d
    INNER JOIN inserted i on 
    d.id = i.id

    insert into DocIn_History (Op_id, ID, LastModified)
    select 2, ID, @CurrentDate from inserted
end


Это общепринятый способ или есть другие варианты?
20 май 14, 10:14    [16040926]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Glory
Member

Откуда:
Сообщений: 104760
Vladimir_V.
Это общепринятый способ или есть другие варианты?

Храните историю изменений в отдельной таблице
20 май 14, 10:26    [16041002]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Glory, так у меня и так в отдельной.
20 май 14, 10:29    [16041020]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Glory
Member

Откуда:
Сообщений: 104760
Vladimir_V.
Glory, так у меня и так в отдельной.

И зачем тогда нужна дата последнего обновления в самой таблице ?
20 май 14, 10:31    [16041030]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Glory, дата последнего изменения постоянно нужна, а история редко. Не хочется только из-за нее обращаться к таблице с историей (усложнять запросы).
Ну и не всегда таблица с историей требуется.
20 май 14, 10:37    [16041060]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Glory
Member

Откуда:
Сообщений: 104760
Vladimir_V.
Не хочется только из-за нее обращаться к таблице с историей (усложнять запросы).

Ну так вы определитесь с желаниями. А то, апдейтить не хочу, а дату хочу.
20 май 14, 10:38    [16041070]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
UPDATE d
SET d.DateLastModified=CURRENT_TIMESTAMP
OUTPUT 2,inserted.id,inserted.DateLastModified INTO DocIn_History(Op_id,ID,LastModified)
FROM DocIN d
JOIN inserted i ON d.id=i.id;
20 май 14, 10:39    [16041080]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Glory
Vladimir_V.
Не хочется только из-за нее обращаться к таблице с историей (усложнять запросы).

Ну так вы определитесь с желаниями. А то, апдейтить не хочу, а дату хочу.


Я имею ввиду, что запись обновляется два раза, а теоретически ведь это можно было бы сделать в одном запросе.
20 май 14, 10:56    [16041187]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Glory
Member

Откуда:
Сообщений: 104760
Vladimir_V.
Я имею ввиду, что запись обновляется два раза, а теоретически ведь это можно было бы сделать в одном запросе.

Ну так и обновляйте ее в запросе, который вызывает срабатывание триггера.
20 май 14, 10:58    [16041193]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Такая конструкция может привести к дедлокам и прочей ереси. Это как из болота себя за волосы вытаскивать.
Храните даты изменения в отдельной таблице или в апдетйы вставьте дополнительное поле DateLastModified для set.

select 2, ID, @CurrentDate from inserted

Это что такое в триггере, зачем?
20 май 14, 11:15    [16041292]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Владислав Колосов
Такая конструкция может привести к дедлокам и прочей ереси. Это как из болота себя за волосы вытаскивать.
Храните даты изменения в отдельной таблице или в апдетйы вставьте дополнительное поле DateLastModified для set.

select 2, ID, @CurrentDate from inserted

Это что такое в триггере, зачем?


Это добавление записи в таблицу с историей.
Из-за чего дедлоки?
20 май 14, 11:33    [16041423]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Vladimir_V.
Владислав Колосов
Такая конструкция может привести к дедлокам и прочей ереси. Это как из болота себя за волосы вытаскивать.
Храните даты изменения в отдельной таблице или в апдетйы вставьте дополнительное поле DateLastModified для set.

select 2, ID, @CurrentDate from inserted


Это что такое в триггере, зачем?


Это добавление записи в таблицу с историей.
Из-за чего дедлоки?
Кстати, логичнее в историю добавлять из deleted, а не из inserted
20 май 14, 11:34    [16041434]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
dma_caviar
Member

Откуда: https://itproduct.ru
Сообщений: 2340
Триггеры это вообще зло.
20 май 14, 11:41    [16041476]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
iap
Кстати, логичнее в историю добавлять из deleted, а не из inserted


Спорный момент. Мне больше нравится видеть в таблице историй сразу все изменения, включая последнее.
20 май 14, 11:43    [16041497]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
dma_caviar
Триггеры это вообще зло.


Серьезно? А журналирование изменений с ними так удобно делать...
20 май 14, 11:55    [16041595]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Vladimir_V.
Glory
пропущено...

Ну так вы определитесь с желаниями. А то, апдейтить не хочу, а дату хочу.


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

ну так и апдейтьте DateLastModified сразу при основном апдейте!!! будет счастье.
p.s А какой смысл в истории вида?? там же нет никакой полезной информации

insert into DocIn_History (Op_id, ID, LastModified)
select 2, ID, @CurrentDate from inserted
20 май 14, 11:55    [16041599]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Vladimir_V.
Из-за чего дедлоки?
Не будет там дедлоков.
dma_caviar
Триггеры это вообще зло.
Триггеры - это инструмент. А в "зло" он превращается, когда им не умеют пользоваться.
20 май 14, 11:56    [16041608]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
dma_caviar
Member

Откуда: https://itproduct.ru
Сообщений: 2340
Vladimir_V.
dma_caviar
Триггеры это вообще зло.


Серьезно? А журналирование изменений с ними так удобно делать...

Куда как проще сделать вот так
Glory
Ну так и обновляйте ее в запросе, который вызывает срабатывание триггера.
20 май 14, 11:57    [16041613]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Vladimir_V.
dma_caviar
Триггеры это вообще зло.


Серьезно? А журналирование изменений с ними так удобно делать...

серьезно - серьезно...
20 май 14, 11:57    [16041620]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Vladimir_V., дедлоки потому, что обновляете таблицу при открытой транзакции по этой же таблице. Что значит "нравится", непонятно. Зачем хранить копию того, что есть уже в основной таблице. Суть реляционной теории как раз состоит в том, чтобы хранить данные без повторений, не надо ее "улучшать" и путать представление "человеческого" интерфейса со способом хранения информации.

То как Вам нравится Вы отображаете средствами клиента.
Само обновление в триггере - избыточно, дата последнего изменения должна быть задана в update таблицы.
create table #t1 (f1 int, f2 datetime default getdate())
insert into #t1 (F1) values (1)
select * from #t1
go
update #t1 set f2 = default where f1 = 1
select * from #t1
go
20 май 14, 12:04    [16041679]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Владислав Колосов,

и что же мешает кому-нибудь взять, да и выполнить UPDATE без поля f2 ?

Триггер - это прекрасно!
20 май 14, 12:08    [16041722]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
dma_caviar
Member

Откуда: https://itproduct.ru
Сообщений: 2340
iap
Владислав Колосов,

и что же мешает кому-нибудь взять, да и выполнить UPDATE без поля f2 ?

Триггер - это прекрасно!

Это уже другой вопрос))
20 май 14, 12:10    [16041745]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Ivan Durak
А какой смысл в истории вида?? там же нет никакой полезной информации


Я просто не стал перечислять все поля из таблицы.

Ivan Durak
ну так и апдейтьте DateLastModified сразу при основном апдейте


Хотелось, чтобы этим занимался сервер на автомате ))
Ну и не знаю я, как с Entity Framework вставить getdate() в поле, которое требует дату)).
20 май 14, 12:10    [16041752]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Vladimir_V.
Ну и не знаю я, как с Entity Framework вставить getdate() в поле, которое требует дату)).

Ну вот. С этого и начали бы. Вам с этим вопросом в другой форум - там подскажут.
20 май 14, 12:18    [16041815]     Ответить | Цитировать Сообщить модератору
 Re: Поле с датой изменения записи  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Ivan Durak, думаю, что предложат написать триггер ))))))
20 май 14, 12:20    [16041859]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить