Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Здравствуйте!
Есть две таблицы p - пациенты и m - запись в карте.
В таблице m есть ссылка на таблицу p: есть ИД таблицы p - m.p_id.
Задача: Записи бывают разных типов (поле в таблице m.models_id). В нашем случае это оформление истории болезни.
Историю болезни можно заводить только 1 раз в день для одного и того же пациента.
Приложение позволяет только лишь включить опцию предупреждения создания повторной истории болезни...
Пользователи в страхе закрывают окно с предупреждением, и получается 2 истории болезни в один день.

Необходимо, чтобы при попытке создания повторной истории болезни (получается, новой записи в таблице m с ИД m.p_id того пациента, в чьей карте мы создаем историю болезни) SQL сервер выдавал ошибку, а не предупреждение.

Что я сделала: отредактировала триггер на вставку записи в таблице m, чтобы пользователь не мог создавать запись в которой поле таблицы m.models_id принимает определенное значение (тестовый тип записи)

BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM inserted WHERE models_id=323)
raiserror('Обязательно заполнить поле Vatnumber',16,1)
end


Вопрос: подскажите, пожалуйста, ссылку, где можно почитать, как написать условие из связанной таблицы для триггера на вставку. Получается курсор в приложении стоит на карте пациента, и проверку нужно проводить именно на создание запсии с ИД текущего пациента на текущую дату.
Опыта в работы с SQL маленький, но учусь с охотой :)
Спасибо заранее за ответы!
3 июн 13, 15:28    [14384386]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
Glory
Member

Откуда:
Сообщений: 104760
al.yugay
Необходимо, чтобы при попытке создания повторной истории болезни (получается, новой записи в таблице m с ИД m.p_id того пациента, в чьей карте мы создаем историю болезни) SQL сервер выдавал ошибку, а не предупреждение.

Сделайте уникальное ограничение

al.yugay
Вопрос: подскажите, пожалуйста, ссылку, где можно почитать, как написать условие из связанной таблицы для триггера на вставку. Получается курсор в приложении стоит на карте пациента, и проверку нужно проводить именно на создание запсии с ИД текущего пациента на текущую дату.

Триггер не может знать про "курсор в приложении стоит на карте пациента"
3 июн 13, 15:36    [14384457]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Здравствуйте! Спасибо за совет. Буду пробовать.
4 июн 13, 05:10    [14386889]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Имеете ввиду CREATE INDEX?
4 июн 13, 13:13    [14388600]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
Glory
Member

Откуда:
Сообщений: 104760
Можете и индекс. Можете и unique constraint
4 июн 13, 13:18    [14388634]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Glory, спасибо за ответ =)
Посмотрите, пожалуйста:

CREATE UNIQUE INDEX INDEX_N ON M (M_ID)
WHERE MODELS_ID=323

А дальше что писать, не знаю...
Получается есть таблица М со значениями:
M_ID P_ID DATE(datetime) MODELS_ID
1 2 04.06.2013 323

Нужно, чтобы SQL сервер выдавал сообщение об ошибке, если пользователь приложения пытается создать запись со следующими полями:

M_ID P_ID DATE(datetime) MODELS_ID
2 2 04.06.2013 323

То есть: нельзя создать одному пациенту за одну дату 2 одинаковые записи. Поле MODELS_ID - ссылается за список типов записей.

Есть еще мысль в триггере прописать
DECLARE @PAT_ID int
SELECT @PAT_ID = (SELECT PATIENTS_ID FROM INSERTED)

только как значение ИД пациента увязать с индексом?...
4 июн 13, 14:28    [14389125]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
Glory
Member

Откуда:
Сообщений: 104760
al.yugay
Посмотрите, пожалуйста:

CREATE UNIQUE INDEX INDEX_N ON M (M_ID)
WHERE MODELS_ID=323

А дальше что писать, не знаю...

А где вы взяли такой синтаксис создания индексов ?
4 июн 13, 14:32    [14389144]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Извините за корявый вид таблиц. Вкладываю файл EXCEL - более наглядно.

К сообщению приложен файл (Пример на вставку записи в таблицу M.xlsx - 8Kb) cкачать
4 июн 13, 14:32    [14389148]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Glory,
в интернете взяла.....
4 июн 13, 14:34    [14389156]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Glory
al.yugay
Посмотрите, пожалуйста:

CREATE UNIQUE INDEX INDEX_N ON M (M_ID)
WHERE MODELS_ID=323

А дальше что писать, не знаю...

А где вы взяли такой синтаксис создания индексов ?

Вполне валидный фильтрованный индекс.
4 июн 13, 14:35    [14389170]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гость333
Glory
пропущено...

А где вы взяли такой синтаксис создания индексов ?

Вполне валидный фильтрованный индекс.

Вы хотите сказать, что ТС осознанно и целенаправленно использовал WHERE в данном случае ?
4 июн 13, 14:43    [14389229]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Да, осознано. Ограничение на значения поля MODELS_ID 323 в таблице M
4 июн 13, 14:46    [14389259]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
уффф... что посоветуете-то?)))
4 июн 13, 14:47    [14389264]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
Glory
Member

Откуда:
Сообщений: 104760
al.yugay
Да, осознано. Ограничение на значения поля MODELS_ID 323 в таблице M

Т.е. для MODELS_ID=324 уже никаких ограничений не будет ?
4 июн 13, 14:48    [14389267]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Glory
Гость333
Glory
пропущено...А где вы взяли такой синтаксис создания индексов ?

Вполне валидный фильтрованный индекс.

Вы хотите сказать, что ТС осознанно и целенаправленно использовал WHERE в данном случае ?

Ни в коем случае :-)
Я хотел сказать, что это валидный синтаксис, не более :-)
4 июн 13, 14:52    [14389298]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
al.yugay

Есть еще мысль в триггере прописать
DECLARE @PAT_ID int
SELECT @PAT_ID = (SELECT PATIENTS_ID FROM INSERTED)

только как значение ИД пациента увязать с индексом?...


Ошибка будет, выбрать множество записей в одну переменную не удастся.

Вам надо мыслить так: триггер срабатывает для множества записей, в вашем случае - если делается вставка множества записей одним инсертом.
4 июн 13, 15:16    [14389465]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
aleks2
Guest
create trigger dbo.[OnlyOne_models_id_323_per_day] on dbo.m
for insert, update
as
if exists( select * 
              from 
               ( select * from inserted where models_id=323 ) i 
               inner join 
               ( select * from dbo.m where models_id=323 ) m 
               on m.p_id = i.p_id and m.id <> i.id
                  and i.[Date] = m.[Date]
                  -- вариация на тему datetime
                  -- and m.[Date] between dateadd( day, -1, i.[Date] ) and dateadd( day, 1, i.[Date] )
          )
  raiserror('ОМГ! Историю болезни можно заводить только 1 раз в день для одного и того же пациента.', 16, 1);


Но CONSTRAINT лучше.
4 июн 13, 15:44    [14389676]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Server 2008: триггер на вставку записи с выводом сообщения об ошибке  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Спасибо всем, кто откликнулся =) пошла пробовать))
5 июн 13, 14:27    [14394825]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить