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

Откуда:
Сообщений: 88
Доброе утро.

Подскажите можно ли сделать триггер, например на удаление в табличке.

Но чтобы он не записывал каждую удаленную строку, а записывал одну строку при одном DELETE ?
5 дек 17, 11:53    [21006723]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
iap
Member

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

а триггер должен обязательно что-то записывать?
Это всего лишь процедура, она выполняет только то, что вы напишете.
5 дек 17, 11:57    [21006740]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
гогол
Member [заблокирован]

Откуда:
Сообщений: 88
iap
гогол,

а триггер должен обязательно что-то записывать?
Это всего лишь процедура, она выполняет только то, что вы напишете.


да, должен записывать данные о клиенте, который вызвал DML.
5 дек 17, 12:00    [21006753]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
iap
Member

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

а триггер должен обязательно что-то записывать?
Это всего лишь процедура, она выполняет только то, что вы напишете.


да, должен записывать данные о клиенте, который вызвал DML.
Просто напишите просто и понятно на русском языке,
что должно получиться. Это можно сделать?
И учтите, что один DELETE необязательно удаляет одну строку. Может и больше. А может и вовсе ни одной.
5 дек 17, 12:03    [21006763]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
гогол
Member [заблокирован]

Откуда:
Сообщений: 88
iap
гогол
пропущено...


да, должен записывать данные о клиенте, который вызвал DML.
Просто напишите просто и понятно на русском языке,
что должно получиться. Это можно сделать?
И учтите, что один DELETE необязательно удаляет одну строку. Может и больше. А может и вовсе ни одной.



Надо чтобы при одной команде DELETE, которая удаляет over 9000 строк, триггер записывал только одну строку.
5 дек 17, 12:06    [21006774]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
create table dbo.test22 (id int);
insert into dbo.test22 values(1), (2), (3), (4), (5);
go

alter trigger dbo.tg1_after_delete on dbo.test22 after delete
as 
set nocount on;
print user;
go

delete dbo.test22

только вам это надо не принтить, а писать куда там вам надо
5 дек 17, 12:10    [21006786]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
гогол
Member [заблокирован]

Откуда:
Сообщений: 88
Вот, например при 1 DELETE вставляет количество строк столько, сколько строк было удалено.

А строк может быть миллиард.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL
    DROP TRIGGER Sales.reminder2;
GO
CREATE TRIGGER reminder2
ON Sales.Customer
AFTER DELETE 
AS

INSERT INTO tr_table(spid) @@SPID;

GO




Нужна 1 строка.
5 дек 17, 12:10    [21006787]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
гогол
Вот, например при 1 DELETE вставляет количество строк столько, сколько строк было удалено.

А строк может быть миллиард.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL
    DROP TRIGGER Sales.reminder2;
GO
CREATE TRIGGER reminder2
ON Sales.Customer
AFTER DELETE 
AS

INSERT INTO tr_table(spid) @@SPID;

GO





Нужна 1 строка.

значит, вы свой миллиард удаляете по одной строке,
написав миллиард делитов.
5 дек 17, 12:13    [21006794]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 774
гогол,

А как это удаление выглядит?
Если это
delete from table where id>9000


То тригер выстреллит 1 раз, а если на клиенте открывается рекордсет и удаляет запись по 1, тригер будет стреллять каждый раз. И понять, что это 1 вызов на самом деле будет не тревиальной задачей
5 дек 17, 12:13    [21006795]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
гогол
Member [заблокирован]

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

Вы правы.

и правда, было просто миллиард DELETE ов.


При одной команде делете удаляющей много строк, триггер вставляет одну.

Большое спасибо.
5 дек 17, 12:17    [21006807]     Ответить | Цитировать Сообщить модератору
 Re: Триггер, которые бы не писал все строки.  [new]
гогол
Member [заблокирован]

Откуда:
Сообщений: 88
Шыфл
гогол,

А как это удаление выглядит?
Если это
delete from table where id>9000


То тригер выстреллит 1 раз, а если на клиенте открывается рекордсет и удаляет запись по 1, тригер будет стреллять каждый раз. И понять, что это 1 вызов на самом деле будет не тревиальной задачей


Действительно дело в пирложении оказалось.

Попробую это профайлером отловить.
5 дек 17, 12:18    [21006812]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить