Как да изтече определен ред в SQL Server, след като бъде достигната дата?

Може да е много прост сценарий за опитни разработчици, но като начинаещ се мотая около това от дълго време. Създавам уебсайт в asp.net, където потребителят може да закупи пакети. Тези пакети имат определен срок на годност, свързан с тях (напр. 2 месеца след покупката, 6 месеца и т.н.).

Проблемът е как да изтече всеки пакет точно на същата дата и час, които съм изчислил на базата на датата на закупуване. Как да направя това нещо?

Използвам SQL Server express edition 2008 и asp.net 4.0.


person vivek    schedule 23.08.2012    source източник
comment
Какво имаш предвид под изтичане? Изтриване от базата данни? Маркиране на поле като изтекло?   -  person robert    schedule 23.08.2012
comment
@WaqarJanjua Не е задействане, ако е след n месеца.   -  person Meryovi    schedule 23.08.2012
comment
@Meryovi Предполагам, че може да иска да изтрие след известно време автоматично.   -  person Waqar Janjua    schedule 23.08.2012
comment
@WaqarJanjua Вярвам, че това би било работа, а не задействане.   -  person Meryovi    schedule 23.08.2012
comment
Просто искам да покажа на потребителя, че закупеният от него пакет вече е с изтекла валидност, това може да стане чрез актуализиране на статуса като изтекъл. но кога трябва да задействам тази заявка за актуализиране? това е проблема.   -  person vivek    schedule 24.08.2012


Отговори (2)


Зависи малко от това какво имате предвид под изтичане - искате ли да изтриете данните, да маркирате записа или просто да скриете данните от екрана на потребителя.

И в двата случая трябва да добавите датата на изтичане като колона към вашата таблица (?пакети) и да запишете изчислената дата на изтичане в тази колона.

След това имате опции като:

  • Изпълнете задание за изтриване/изтичане на записа, след като е изтекъл, т.е. CURRENT_TIMESTAMP is > ExpiryDate (SQL Express няма SQL Agent, така че ще трябва например да напишете услуга на Windows или да се свържете с Windows Task Scheduler, за да направите това).
  • Или променете приложението си, за да „проверявате“ стойността на ExpiryDate (напр. DateTime.Now >= ExpiryDate) и след това заключете потребителя/скрийте пакета от потребителския интерфейс.
person StuartLC    schedule 23.08.2012
comment
Възможно е услугата Windows да работи в този случай. Първо ще пробвам този вариант. - person vivek; 24.08.2012

Вместо да изтривате записите, можете да поставите клауза WHERE на място, която ще изключи записите въз основа на тяхната дата на изтичане:

SELECT PackageName
FROM Package
WHERE ExpiryDate>GETDATE()

Ако все пак искате да ги премахнете от базата данни, можете да поставите SQL Job на място, което се изпълнява всеки ден/час и т.н., което ще изтрие записи, които са изтекли:

DELETE FROM Package
WHERE ExpiryDate<GETDATE()
person Curt    schedule 23.08.2012