Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Trigger по предотвращению добавления строки, Trigger по предотвращению добавления стр 
:(
    Опции темы
Killerman
  Дата 9.3.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Во время создания БД возникла проблема, которую я не могу понять как решить.

В БД есть 2-ве таблицы: Remonti(Nremonta, ClientID, CarID,State_r) :: Первичный ключ Nremonta

и Сlient(Nremonta_c,ClientID_c, CarID_c, dateRemonta). Первичный ключ Nremonta_c


После окончания ремонта данные из таблицы ремонтов записываются в данные клиентов.

Client.Nremonta_c ссылается на Remonti.Nremonta.  И поэтому в таблице клиентов не может быть записей с номерами ремонтов, которые не соответствуют номерам ремонтов в таблице ремонтов. 

Но поскольку ClientID_c и CarID_c из таблицы клиентов никак не привязаны к Nremonta и ClientID из таблицы ремонта, то может возникнуть несоответствие, к примеру при одинаковых Номерах ремонта в обеих таблицах будут разные значения Идов  клиентов и Номеров машин там и там.

Я думал создать триггер для таблицы Клиентов, чтобы при добавлении в таблицу клиентов, проверять соответствуют ли их Ид идам из таблицы ремонтов, где номера ремонтов совпадают там и там.
Если разные, то отменить добавление в таблицу клиентов и выдать ошубку.

Как это можно сделать?   smile  smile 


Это сообщение отредактировал(а) Killerman - 9.3.2008, 18:30
PM MAIL   Вверх
PashaPash
Дата 9.3.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



Killerman, простой выход - не копируй ClientID и CarID из первой таблицы во вторую. Ты все равно можешь в любой момент сходить по ссылке из второй таблицы в первую и получить нужные значения.


--------------------
PM MAIL WWW   Вверх
Killerman
Дата 9.3.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Но мне нада, так как потом нада будет из клиентов выбрать машины, которые ремонтировались и посмотреть на их гарантии на детали. Хотя по логике можно обратиться ктаблице ремонтов, но у этих таблиц разные  предназначения и права доступа.

Это сообщение отредактировал(а) Killerman - 9.3.2008, 19:46
PM MAIL   Вверх
PashaPash
Дата 9.3.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



Killerman если предназначения таблиц мешают нормально писать приложение, то их нужно срочно менять smile
Вот пример прямо из msdn, переделай его для своих таблиц:
Код
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
   DROP TRIGGER Purchasing.LowCredit
GO
CREATE TRIGGER LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
DECLARE @creditrating tinyint,
   @vendorid int
SELECT @creditrating = v.CreditRating, @vendorid = p.VendorID
FROM Purchasing.PurchaseOrderHeader p INNER JOIN inserted i ON p.PurchaseOrderID =
   i.PurchaseOrderID JOIN Purchasing.Vendor v on v.VendorID = i.VendorID
IF @creditrating = 5
BEGIN
   RAISERROR ('This vendor''s credit rating is too low to accept new
      purchase orders.', 16, 1)
ROLLBACK TRANSACTION
END



--------------------
PM MAIL WWW   Вверх
Killerman
Дата 9.3.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Код

CREATE TRIGGER Client_constraint
ON dbo.Client 
AFTER INSERT
AS

DECLARE @ClientID1 numeric 
DECLARE @CarID1 numeric
DECLARE @Nzakaza_remont1 numeric
/*
set @ClientID1        = (SELECT     ClientID  FROM  inserted)
set @CarID1           = (SELECT   CarID  FROM  inserted)
set @Nzakaza_remont1  = (SELECT  Nzakaza_remont  FROM  inserted)
*/
SELECT @ClientID1  =i.ClientID, @CarID1 = i.CarID, @Nzakaza_remont1 =i.Nzakaza_remont
FROM Client cl INNER JOIN inserted i ON cl.Nzakaza_remont = i.Nzakaza_remont

IF not EXISTS (SELECT * FROM Zakaz_remont
    WHERE     (Nzakaza_remont = @Nzakaza_remont1) AND (ClientID = @ClientID1) AND (CarID = @CarID1))
Begin
 PRINT N'Constraints violation';
Rollback Transaction
End



Вот такой триггер. Но он не работает. Тоесть в Клиентов всеравно добавляются строки с тем же номером ремонта что и в таблице ремонта, но с другими ClientID и/или CarID.

Ограничение не срабатывает.  smile 

Это сообщение отредактировал(а) Killerman - 9.3.2008, 20:30
PM MAIL   Вверх
Killerman
Дата 9.3.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Все работает. smile  Просто нада еще добавить возле ON INSERT - UPDATE.

Пасиба. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0422 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.