Обеспечение эффективности датированных записей в SQL - PullRequest
1 голос
/ 06 октября 2009

Предположим, у меня есть запись со столбцом под названием «Имя». Каждая запись может иметь дату вступления в силу, поэтому у меня также есть дата вступления в силу и столбец с датой окончания срока действия.

Столбец «Имя» должен быть уникальным, но только в пределах перекрывающихся периодов даты вступления в силу и истечения срока действия. Я ищу какой-то эффективный способ обеспечить это из серверной части SQL (я использую MS SQL 2008).

Ответы [ 2 ]

4 голосов
/ 06 октября 2009

Для этого вы бы использовали триггер INSERT / UPDATE .

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

0 голосов
/ 06 октября 2009

Вот модель данных

Table A (

name char (32) not null,
effdt date not null,
effseq int not null,
effstatus char (1) not null,

other data columns ..

)

Primary_Key A_Key (name, effdt, effseq);

Вот данные:

'A', '1/1/2009', 1, 'A', 'Otherdata'
'A', '1/1/2009', 2, 'A', 'Otherdata 2'
'B', '1/1/2009', 1, 'A', 'B data'
'B', '1/1/2009', 2, 'I', 'B Data'

Вот правила:

Используйте Effdt для хранения даты, когда строка должна использоваться или вступать в силу. Возможно, это не дата, когда данные хранятся / создаются.

Используйте Effseq для хранения нескольких обновлений на любую дату. Всегда следует начинать с 1.

Используйте EFFStatus для инактивации данных. Никогда не удаляйте данные в эффективной устаревшей схеме. Удаление также усложняет задачу аудита.

Когда вы «обновляете» строку, никогда не обновляйте столбец EFFDT. Всегда создавайте новую строку с новым EFFDT. Если EFFDT уже существует, используйте следующий EFFSEQ.

Это может быть хорошей идеей, чтобы сохранить updateuserid и updatetimestamp также в строке. Особенно, если вы хотите отслеживать изменения.

Вот вопросы:

Чтобы получить все данные:

Select * from A

Чтобы получить все "активные строки" на сегодняшний день:

Select * from A A1
where effdt = (select max (EFFDT) from A where name= A1.name 
                                      and effdt <= getdate())
and effseq = (select max(effseq) from A where name=A1.name and effdt=A1.effdt)
and eff_status = 'A'

Чтобы получить все строки на указанную дату прошлого / будущего:

Замените getdate () на фактическую дату, указанную выше.

Если вы пишете веб-приложение, вот правила поля формы:

Вставить форму:

EFFDT : Editable, Default Value = Today
EFFSEQ : Non Editable, Default Value = "#Next". 
Interpret what is "Next" in the backend.

Форма обновления:

EFFDT : Editable, Default= current Value.
EFFSEQ : Non-Editable, Default = "#Next" 

Удалить форму:

All data non editable, On Delete Action, set EFF_STATUS='I'

История Редактировать:

This is a "super user" feature only. 
EFFDT = Non Editable, Default is Current Date
EFFSEQ = Non-Editable, Default is Current Value

Все остальные поля доступны для редактирования, и выполняется настоящее обновление строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...