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

Откуда:
Сообщений: 1253
у меня есть 1 таблица - seller (продавец).
в ней несколько колонок - имя продавца, фамилия.

мне необходимо написать триггер, который будет сохранять информацию о добавлении, изменении и удалении продавцов + время добавления/изменения/удаления продавца.

как я понял из теории схема триггера такая:


CREATE TRIGGER имя_триггера
BEFORE | AFTER <триггерное_событие>
ON <имя_таблицы>
[REFERENCING
<список_старых_или_новых_псевдонимов>]
[FOR EACH { ROW | STATEMENT}]
[WHEN(условие_триггера)]
<тело_триггера>



Скажите, что такое - <триггерное_событие> и <список_старых_или_новых_псевдонимов>
25 май 11, 08:43    [10703741]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Students,

Я понимаю, что единственное, что Вы помните, от этого предмета, что "учебник" синий. Но с выбором раздела форума (СУБД) Вы ошиблись.
25 май 11, 08:49    [10703757]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Students
Member

Откуда:
Сообщений: 1253
я тут разобрался, но триггер всё равно не работает.
сначала я создал таблицу seller и заполнил её.
потом написал триггер. вот код:

create trigger seller_trigger on seller
instead of insert
as declare 
@ID int
@Name char(50)
@Age int
@operation char(50)
@time_data int
declare cursorofinstead cursor for
select
[Name],
[Age]
from inserted open cursorofinstead
fetch next from cursorofinstead
into
@Name
@Age
while @@FETCH_STATUS = 0
set @operation = 'insert'
set @ID time = getdate()
insert into dbo.seller(Name,Age) Values (@name,@age)
select @@IDENTITY
from dbo.seller
set @ID=@@IDENTITY
insert into dbo.seller_trigger
(peopleID,operation,time_data)
values(@ID,@operations,@time_data)
fetch next from cursorofinserted
into
@Name
@Age
end 
close cursorofinserted
deallocate cursorofinerted
go

но триггер не работает. пишет ошибку в строке @Name char(50).
В чём может быть ошибка? Для time_data нужно писать тип int или для отображении времени есть свой тип?
26 май 11, 14:18    [10713136]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Students,

ошибка в том, что синтаксис надо не придумывать, а читать в документации.
http://msdn.microsoft.com/ru-ru/library/ms188927.aspx
26 май 11, 14:19    [10713147]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
вот ето лисапед..... у нас что савсем разучились читать документацию ,и проверять то что пишут ???
26 май 11, 14:23    [10713176]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Maxx,

да уж, чет я сначала не вчитался

Students,

сотрите это. Потом откройте документацию и почитайте про OUTPUT. И запишите себе где-нибудь на подкорке: курсоры - зло. Причем практически абсолютное.
26 май 11, 14:26    [10713199]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Students
Member

Откуда:
Сообщений: 1253
iljy
Maxx,

да уж, чет я сначала не вчитался

Students,

сотрите это. Потом откройте документацию и почитайте про OUTPUT. И запишите себе где-нибудь на подкорке: курсоры - зло. Причем практически абсолютное.


я просто хочу, чтобы когда добавлял продавца - в таблице триггеров писало время добавления нового продавца и операция - добавлен.
а можно разве без курсоров создать? если добавлять продавцов не по одному а сразу по многу
26 май 11, 14:37    [10713289]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Students,

ссылку, которую я дал, прочитали?
26 май 11, 14:39    [10713312]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Присоединяюсь к ответившим выше.
На всякий случай намекну студенту, что в конкретном случае сервер хочет запятых.
А всё Ваше логирование - это один INSERT в триггере FOR INSERT
Или действительно OUTPUT в INSERT/DELETE/UPDATE, если версия позволяет.
Однако, в этом случае не будет гарантии, что какой-нибудь клиент не вставит записи без какого-либо логирования.
Кроме того, в триггере AFTER UPDATE легко логировать действительное изменение значений в полях.
26 май 11, 14:42    [10713325]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Students
Member

Откуда:
Сообщений: 1253
iljy
Students,

ссылку, которую я дал, прочитали?


читаю. я прочитаю, пойму, потом исправлю код.
26 май 11, 14:47    [10713371]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
iap
Member

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

и я опять не понимаю, зачем логировать вставленные записи, если они и так находятся в таблице?
Добавить ещё поля "Кто?" и "Когда?", да и дело с концом!
26 май 11, 14:51    [10713418]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Students
Member

Откуда:
Сообщений: 1253
да, я просто забыл про запятые. сейчас их поставил.
но всё равно не работает

CREATE TABLE seller
( ID int identity,
  Name char(50) NOT NULL,
  Age int NOT NULL Default 0,
  CONSTRAINT pk_seller PRIMARY KEY (ID)
)

insert into seller (Name, Age) values
('Ivan', 20), 
('Petr', 21), 
('Anton', 22)

create trigger seller_trigger on seller
instead of insert
as declare 
@ID int,
@Name char(50),
@Age int,
@operation nvarchar(50),
@time_data nvarchar(50)
declare cursorofinstead cursor for
select
[Name],
[Age]
from inserted open cursorofinstead
fetch next from cursorofinstead
into
@Name,
@Age
while @@FETCH_STATUS = 0
set @operation = 'insert'
set @time_data = getdate()
insert into dbo.seller(Name,Age) Values (@name,@age)
select @@IDENTITY
from dbo.seller
set @ID=@@IDENTITY
insert into dbo.seller_trigger
(ID,operation,time_data)
values(@ID,@operation,@time_data)
fetch next from cursorofinserted
into
@Name
@Age
end 
close cursorofinserted
deallocate cursorofinerted
go

написано: строка 31 Неправильный синтаксис около конструкции "@Age". но я не могу понять в чём ошибка. если я при сроздании таблицы один из столбиков - Default 0, то к ней нельзя обращаться?
27 май 11, 12:42    [10718853]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
s.w.a.n.
Member

Откуда: Москва
Сообщений: 137
Students,
into
@Name,
@Age
27 май 11, 12:44    [10718871]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Students
Member

Откуда:
Сообщений: 1253
s.w.a.n.
Students,
into
@Name,
@Age


всё время забываю про запятые...
но теперь пишет другую ошибку: неправильный синтаксис около ключевого слова "close".
(см. картинку)

логично, что если у меня есть open cursorofinserted, то должен быть close cursorofinserted

К сообщению приложен файл. Размер - 100Kb
27 май 11, 13:02    [10719071]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Students
...логично, что если у меня есть open cursorofinserted, то должен быть close cursorofinserted
Нелогично то, что у вас есть END и нет к нему BEGIN-а.
27 май 11, 13:06    [10719106]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
s.w.a.n.
Member

Откуда: Москва
Сообщений: 137
Students,
while @@FETCH_STATUS = 0
BEGIN
27 май 11, 13:09    [10719123]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Students
Member

Откуда:
Сообщений: 1253
s.w.a.n.
Students,
while @@FETCH_STATUS = 0
BEGIN

ясно, спасибо. значит begin эквивалентно "{", а end эквивалентно "}" на С++.

после нажатия F5 было написано "Выполнение команд успешно завершено.", т.е. всё работает;
однако после того как я попытался добавить новые данные в таблицу (чтобы посмотреть - будет отображать триггер добавленные данные и время), появилась ошибка - процедура seller_trigger, строка 10 Курсор с именем "cursorofinserted" не существует.

Скажите, может быть я чего-то не учёл, или после создания триггера нельзя добавлять данные в таблицу обычным образом?
Об этом в теории ничего не сказано.

вот код:
CREATE TABLE seller
( ID int identity,
  Name char(50) NOT NULL,
  Age int NOT NULL Default 0,
  CONSTRAINT pk_seller PRIMARY KEY (ID)
)

insert into seller (Name, Age) values
('Ivan', 20), 
('Petr', 21), 
('Anton', 22)

create trigger seller_trigger on seller
instead of insert
as declare 
@ID int,
@Name char(50),
@Age int,
@operation char(50),
@time_data char(50)
declare cursorofinstead cursor for
select
[Name],
[Age]
from inserted open cursorofinserted
fetch next from cursorofinstead
into
@Name,
@Age
while @@FETCH_STATUS = 0
begin
set @operation = 'insert'
set @time_data = getdate()
insert into dbo.seller(Name,Age) Values (@name,@age)
select @@IDENTITY
from dbo.seller
set @ID=@@IDENTITY
insert into dbo.seller_trigger
(ID,operation,time_data)
values(@ID,@operation,@time_data)
fetch next from cursorofinserted
into
@Name,
@Age
end 
close cursorofinserted
deallocate cursorofinstead
go
27 май 11, 13:30    [10719298]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Students
процедура seller_trigger, строка 10 Курсор с именем "cursorofinserted" не существует.
Ну, а где OPEN этого курсора то?
27 май 11, 13:34    [10719336]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Упс... пардон! (безобразное форматирование кода)
27 май 11, 13:35    [10719352]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Students
Member

Откуда:
Сообщений: 1253
tpg
Students
процедура seller_trigger, строка 10 Курсор с именем "cursorofinserted" не существует.
Ну, а где OPEN этого курсора то?



.
.
.
select
[Name],
[Age]
from inserted OPEN cursorofinserted
fetch next from cursorofinstead
into
@Name,
@Age
.
.
.
27 май 11, 13:36    [10719366]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Да че вы паритесь с переносами строки? Пишите уже все в одну строку!
27 май 11, 13:37    [10719375]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Students,

у вас в declare и в deallocate другое имя курсора написано.
Теперь мы весь код по буквам за вами должны проверять?
27 май 11, 13:38    [10719388]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
Students
Member

Откуда:
Сообщений: 1253
хорошо. буду писать красиво. я подумал - если при нажатии F5 было написано "Выполнение команд успешно завершено.", то это означает, что триггер был написан правильно или по крайне мере работает. т.е. ошибка, возмоожно, не в триггере, а в том, что я нужно по другому добавлять данные? т.е. если до создания триггера я добавлял данные так:

insert into seller (Name, Age) values
('Ivan', 20), 
('Petr', 21), 
('Anton', 22)

то после создания триггера добавлять данные нужно точно так же?
27 май 11, 13:41    [10719416]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Students
...я подумал - если при нажатии F5 было написано "Выполнение команд успешно завершено.", то это означает, что триггер был написан правильно или по крайне мере работает...
Это только означает, что у вас не было синтаксических ошибок и триггер создан.
27 май 11, 13:47    [10719454]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать простейший триггер  [new]
invm
Member

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

А вот если бы не ленились и пользовались форматированием кода, то и вопроса бы не возникло. Кстати, вам уже говорили, что курсор там ни к чему, а вы все упорствуете. А если уж пользуете курсор, то следите, чтобы его имя везде было одинаково :)
27 май 11, 13:47    [10719457]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить