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

Откуда:
Сообщений: 69
Всем доброго вечера, у меня такая проблемка у меня есть две процедуры.
Первая :
create_folder - создает папку на компьютере и в конце процедуры я написал если папка не создалась то выдавать ERROR а если создалась то выводить адрес папки. входные параметры в ней @num в нее я руками вбивал ID
Вторая :
Create_link - генерировала ссылку при нажатии на которую пользователь отправлялся в папку на компе. параметры @link -собственно адрес папки и @c_id - IDшник Документа.
чтобы автоматизировать этот процесс повесил на табличку триггер который при создании документа(записи в таблицу значений) сначало тянул из таблички IDшник записи , запускал сначала первую процедуру создавал папку, потом хватал бы получившийся адрес папки и записывал во вторую ХП параметр ID и адрес папки . Собственно вопрос Правильно ли я написал Триггер( не писал их раньше) дело в том что он при создании документа в программе выдает жудкую ошибку типо извини не могу записать в табличку из за твоего триггера , отключаю его и нормально все проходит,Интересно я где то в коде накасячил или какие то настройки в самой SQL SERVER 2008 есть или может быть что то еще?
Вторая процедура
CREATE TRIGGER [dbo].[Link] 
ON [dbo].[tabl]
AFTER Update
AS
BEGIN
SET NOCOUNT ON;
IF (SELECT   [ID]
     FROM   inserted) = '31'
BEGIN
DECLARE @num int = (SELECT [ID] FROM inserted)
DECLARE @qw nvarchar(255)
  EXEC @qw = [dbo].[create_folder]  @num
IF @qw <> 'ERROR'

BEGIN
DECLARE @link nvarchar(255) = @qw
DECLARE @c_id int = @num
  EXEC [dbo].[create_link] @link ,@c_id
end
end
30 янв 14, 22:06    [15497313]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
1. Every stored procedure returns an integer return code to the caller
2. триггер работает для множества записей (inserted, deleted)
3. что будет, если ошибка произойдет в однйо из двух процеду? запись в вашем примере апдейтнется в любом случае
Если надо, чтобы она не изменилась сделайте rollback
30 янв 14, 22:52    [15497460]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
aleks2
Guest
Winnipuh
Если надо, чтобы она не изменилась сделайте rollback

Нинадо делать в триггере rollback.
Не учите говнокодированию.

Raiserror надо делать.
31 янв 14, 05:32    [15498059]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
aleks2
Winnipuh
Если надо, чтобы она не изменилась сделайте rollback

Нинадо делать в триггере rollback.
Не учите говнокодированию.

Raiserror надо делать.


да, согласен.
Хотя бывает полезно.
31 янв 14, 11:13    [15498986]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
LOLchik
Guest
вопрос почему не выводит таблицы INSERTED DELETED


create trigger TR_SUBJECT on dbo.SUBJECT
for insert,update,delete
as
if exists (select * from inserted)and
exists (select *from deleted)
print 'Update';

else if exists (select * from inserted)and
not exists (select *from deleted)
print 'Insert';

else if not exists (select * from inserted)and
exists (select *from deleted)
print 'Delete';
2 фев 14, 15:26    [15506567]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
LOLchik
вопрос почему не выводит таблицы INSERTED DELETED


create trigger TR_SUBJECT on dbo.SUBJECT
for insert,update,delete
as
if exists (select * from inserted)and
exists (select *from deleted)
print 'Update';

else if exists (select * from inserted)and
not exists (select *from deleted)
print 'Insert';

else if not exists (select * from inserted)and
exists (select *from deleted)
print 'Delete';
А если выполнить
UPDATE dbo.SUBJECT SET Field=Field WHERE 2*2=5
?

Было много обсуждений. Например: https://www.sql.ru/forum/1260/mozhno-li-v-triggere-for-u-i-d-opredelit-kakoe-deystvie-nad-tabl-vyzvalo-ego
2 фев 14, 15:33    [15506577]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
LOLchik
Guest
iap,

не работает UPDATE SUBJECT
SET SUBJECT_NAME = SUBJECT WHERE 2*2=5
столбцы в таблице
subject, subject_name
2 фев 14, 17:44    [15506819]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
lolchik
Guest
LOLchik,
триггеры
after
instead of

хотелось бы лицезреть! не пустые таблицы; INSERTED DELETED

как это сделать,
2 фев 14, 18:10    [15506867]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
Glory
Member

Откуда:
Сообщений: 104760
lolchik
хотелось бы лицезреть! не пустые таблицы; INSERTED DELETED

Они будут непустые, если командой была затронута хоть одна запись.
2 фев 14, 18:31    [15506905]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
LOLchik
Guest
создал триггер

create trigger [dbo].[TR_SUBJECT] on [dbo].[SUBJECT]
instead of insert,update,delete
as

if exists (select * from inserted)and
exists (select *from deleted)
print 'Update';
else if exists (select * from inserted)and
not exists (select *from deleted)
print 'Insert';
else if not exists (select * from inserted)and
exists (select *from deleted)
print 'Delete';
else print 'Unknowm';

GO

ввожу событие

insert into SUBJECT(SUBJECT,SUBJECT_NAME)
values ('еее','ййй');
go
--------------
delete dbo.SUBJECT where SUBJECT ='еее'
go
--------------------
update dbo.SUBJECT
set SUBJECT_NAME = 'ййй'
where SUBJECT = 'ццц'
go

получаю сообщение

Insert
(строк обработано: 1)
delete
(строк обработано: 1)
update
(строк обработано: 1)


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

что нужно изменить в триггере чтобы вывелись две таблицы INSERTED DELETED
2 фев 14, 20:10    [15507170]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
LOLchik
Guest
LOLchik
создал триггер

create trigger [dbo].[TR_SUBJECT] on [dbo].[SUBJECT]
instead of insert,update,delete
as

if exists (select * from inserted)and
exists (select *from deleted)
print 'Update';
else if exists (select * from inserted)and
not exists (select *from deleted)
print 'Insert';
else if not exists (select * from inserted)and
exists (select *from deleted)
print 'Delete';
else print 'Unknowm';

GO

ввожу событие

insert into SUBJECT(SUBJECT,SUBJECT_NAME)
values ('еее','ййй');
go
--------------
delete dbo.SUBJECT where SUBJECT ='еее'
go
--------------------
update dbo.SUBJECT
set SUBJECT_NAME = 'ййй'
where SUBJECT = 'ццц'
go

получаю сообщение

Insert
(строк обработано: 1)
delete
(строк обработано: 1)
update
(строк обработано: 1)


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

что нужно изменить в триггере чтобы вывелись две таблицы INSERTED DELETED

ошибочно записал триггер after
2 фев 14, 20:13    [15507173]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
Glory
Member

Откуда:
Сообщений: 104760
LOLchik
обьясните мне ту...ому, где таблицы? почему они невидны на экране?

А где у вас их вывод "на экран" ? У вас только print c текстовой строкой есть
2 фев 14, 20:42    [15507288]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
LOLchik
Guest
Glory,
no...
create trigger TR_SUBJECT on dbo.SUBJECT
for insert,update,delete
as
if exists (select * from inserted)and
exists (select *from deleted)
begin
print 'Update';
end
else if exists (select * from inserted)and
not exists (select *from deleted)
begin
print 'Insert';
end
else if not exists (select * from inserted)and
exists (select *from deleted)
begin
print 'Delete';
end
2 фев 14, 21:30    [15507447]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
iap
Member

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

ну напишите же после PRINT SELECT * FROM deleted; SELECT * FROM inserted; !
Правда, хитрый Microsoft постоянно обещает прикрыть лавочку.
По их концепции триггер не должен что-либо возвращать клиенту.
Только сообщения об ошибках с помощью RAISERROR()
2 фев 14, 21:35    [15507460]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
iap
Member

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

но если команда не затронет ни одной записи,
таким способом определить, что конкретно
выполнялось - DELETE, INSERT или UPDATE - не получится.
Ибо пустыми будут и deleted и inserted
2 фев 14, 21:38    [15507465]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру  [new]
LOLchik
Guest
iap,
спасибо работает
2 фев 14, 21:40    [15507471]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить