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

Откуда:
Сообщений: 33
Как создать триггер, который проверяет, чтобы у каждого клиента не было открыто в одной валюте более одного банковского счета.
Таблица:

CREATE TABLE Account (
account_number bigint NOT NULL,
c_identification_code bigint NOT NULL,
account_type varchar (10) NOT NULL CHECK (account_type IN ('salary', 'depositary')),
currency char (3) CHECK (currency IN ('UAH', 'USD', 'EUR')),
opening_an_account date NOT NULL,
account_balance money NOT NULL DEFAULT 0.00,
snapshot_date date,
PRIMARY KEY (snapshot_date, account_number),
FOREIGN KEY (c_identification_code) REFERENCES Сustomers (identification_code))
7 мар 18, 10:48    [21242616]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20190
Нафига проверять? нафига триггер? уникальный индекс на (юзер, валюта) гарантированно исключит появления второй записи у юзера в той же валюте.
7 мар 18, 11:09    [21242675]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
cglcz
Member

Откуда:
Сообщений: 33
Akina, так поставлена задача
7 мар 18, 11:12    [21242689]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
cglcz,

проще всего создать уникальный индекс по этим полям.
Это будет эффективнее триггера.
Можно и констрейнт UNIQUE. Но и в этом случае сервер автоматически создаст уникальный индекс.
7 мар 18, 11:15    [21242701]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
cglcz
Akina, так поставлена задача
Покажите, что вы уже сделали.
7 мар 18, 11:17    [21242709]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20190
cglcz
Как создать триггер, который проверяет
А теперь по буквам.
Триггер по факту выполнения неких действий с данными выполняет некие действия либо дополнительно к тем, которые вызвали его срабатывание, либо вместо них.
А вот к какой заднице прилепить "проверку"? ну проверили... дальше-то что?
7 мар 18, 11:19    [21242720]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
Akina,

ну поставили человеку такую задачу, чего упираться то? :)
исходя из постановки, если пытаются добавить в таблицу счёт, а у клиента уже есть,
то выводить сообщение об ошибке.
делов то...
7 мар 18, 11:59    [21242888]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Дедушка
Akina,

ну поставили человеку такую задачу, чего упираться то? :)
исходя из постановки, если пытаются добавить в таблицу счёт, а у клиента уже есть,
то выводить сообщение об ошибке.
делов то...
Можно не добавлять только "неправильные" счета, можно вообще отменить всю вставку, возможны и другие варианты.
Кроме того, и в случае апдейта тоже придётся проверять.
В общем, не хватает ясности в постановке.
И всё-таки, cglcz, требуется для вас придумать постановку задачи и решить её "под ключ"
или поправить какое-то ваше решение и реализацию? В таком случае покажите её нам.
7 мар 18, 12:21    [21242977]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 774
ALTER TRIGGER [dbo].[trg] ON [dbo].[Account]
FOR instead of INSERT
as
begin
	if exists
	(
		select 1 from Account a inner join inserted i 
		on a.c_identification_code = i.c_identification_code  
		and a.account_type = i.account_type 
		and a.currency = i.currency
	)
	begin
		select 'Мама, этот поц хочет второй счёт, что делать?'
	end
end
7 мар 18, 12:50    [21243042]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Шыфл,

FOR = AFTER

FOR INSTEAD OF - такого не бывает
7 мар 18, 12:57    [21243052]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
Гость, проходящий мимо
Guest
cglcz,

а чем уникальный индекс не подходит?
7 мар 18, 14:33    [21243376]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30763
Гость, проходящий мимо
cglcz,

а чем уникальный индекс не подходит?
Тем, что препод лабу не засчитает.
7 мар 18, 14:34    [21243379]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
cglcz
Member

Откуда:
Сообщений: 33
CREATE TRIGGER [dbo].[trg] ON [dbo].[Account]
FOR INSERT, UPDATE
as
begin
if exists
(
select 1 from Account a inner join inserted i
on a.c_identification_code = i.c_identification_code
and a.account_type = i.account_type
and a.currency = i.currency
)
begin
select 'Error'
end
end

пока вот такой набросок получился, но подчеркивает красным всю первую строку
CREATE TRIGGER [dbo].[trg] ON [dbo].[Account]
7 мар 18, 14:37    [21243394]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30763
cglcz
но подчеркивает красным всю первую строку
Перед ней в окне ничего нет?
7 мар 18, 14:43    [21243420]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
xenix
Guest
cglcz,
так у Вас наверное уже есть такой триггер
IF OBJECT_ID(N'[dbo].[trg]',N'TR')IS NOT NULL
  DROP TRIGGER [dbo].[trg];
GO
CREATE TRIGGER [dbo].[trg]
......
7 мар 18, 14:56    [21243470]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
cglcz
Member

Откуда:
Сообщений: 33
xenix,
нет, точно нету
7 мар 18, 15:01    [21243486]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
cglcz
Member

Откуда:
Сообщений: 33
все получилось, всем спасибо за помощь)
7 мар 18, 15:03    [21243494]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
cglcz
все получилось, всем спасибо за помощь)


я канешно дико извеняюсь НО какой тайный смысл такого триггера ?

CREATE TRIGGER [dbo].[trg] ON [dbo].[Account]
FOR INSERT, UPDATE
as
begin
	if exists
	(
	select 1 from Account a inner join inserted i 
	on a.c_identification_code = i.c_identification_code 
	and a.account_type = i.account_type 
	and a.currency = i.currency
	)
	begin
	select 'Error'
-- ну відал он вам еррор и шо дальше ? Действие произошло и осталось в таблице
	end
end
7 мар 18, 15:10    [21243525]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
cglcz,

вы в курсе, что триггер FOR INSERT, UPDATE срабатывает после вставки/изменения?
К этому моменту записи уже вставлены!
Сравнивать inserted с таблицей бессмысленно!
Оно всегда будет давать TRUE
7 мар 18, 17:04    [21243757]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер, который проверяет запись на уникальность  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
iap
cglcz,

вы в курсе, что триггер FOR INSERT, UPDATE срабатывает после вставки/изменения?
К этому моменту записи уже вставлены!
Сравнивать inserted с таблицей бессмысленно!
Оно всегда будет давать TRUE
А вот рассмотреть триггер INSTEAD OF INSERT, UPDATE очень даже стоит!
7 мар 18, 17:05    [21243762]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить