Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подойдет ли мне триггер? / 25 сообщений из 26, страница 1 из 2
08.09.2020, 16:09
    #39996618
Подойдет ли мне триггер?
Здравствуйте!

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

Сработает ли такая идея или триггер сработает только в конце, когда команда DELETE отработает до конца, удалив все намеченные на удаление в ней строки(и соответственно я не пойму, что обнулило таблицу2)?
...
Рейтинг: 0 / 0
08.09.2020, 16:12
    #39996619
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Борис Гаркун
Хочу отследить после удаления какой строки в таблице1 таблица2 становится пустой


Зачем? У вас всего два вариант:
- уже имеющийся триггер
- каскадное удаление

Достаточно их проверить, чтобы понять, почему у вас записи удаляются во второй таблице.
...
Рейтинг: 0 / 0
08.09.2020, 16:18
    #39996623
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Критик
Борис Гаркун
Хочу отследить после удаления какой строки в таблице1 таблица2 становится пустой


Зачем? У вас всего два вариант:
- уже имеющийся триггер
- каскадное удаление

Достаточно их проверить, чтобы понять, почему у вас записи удаляются во второй таблице.
есть еще джобы
и злобные юзеры


да много еще можно придумать ))
...
Рейтинг: 0 / 0
08.09.2020, 16:32
    #39996630
Подойдет ли мне триггер?
Да. В общем подойдет ли мне триггер?
...
Рейтинг: 0 / 0
08.09.2020, 17:19
    #39996650
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Борис Гаркун
Да. В общем подойдет ли мне триггер?

когда вообще все строки исчезают, это скорее всего truncate.
и никакой триггер на delete его не отловит.
а запускать этот truncate можно хоть с линкед сервера,
о котором вы даже не подозреваете.

охота проверить версию с delete?
ну напишите триггер.
но не на первую таблицу, а на ту, из которой строки исчезают.
и логируйте в триггере dbcc inputbuffer включительно
...
Рейтинг: 0 / 0
08.09.2020, 18:43
    #39996679
Подойдет ли мне триггер?
Yasha123
но не на первую таблицу, а на ту, из которой строки исчезают.

в этом случае как мне понять тогда, какая была удалена строка в таблице1?
...
Рейтинг: 0 / 0
08.09.2020, 18:59
    #39996687
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Борис Гаркун
Yasha123
но не на первую таблицу, а на ту, из которой строки исчезают.

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

А откуда уверенность, что эти операции связанны друг с другом?
...
Рейтинг: 0 / 0
09.09.2020, 09:09
    #39996787
Подойдет ли мне триггер?
Уверенность оттуда, что это факт. Я проверяю количество записей в таблице2 до и после удаления некоторого количества записей из таблицы1. Попробовал я кстати сделать триггер, не помогло, в нем отлогированы все записи удаленные из таблицы1, и сразу же с первой удаленной строкой количество записей в таблице2 стало равным 0. Удаление кстати завернуто в транзакцию, может из-за этого так неинформативно получилось с триггером? Когда удалил отдельно одну строку, то количество записей в таблице2 уменьшилось на несколько штук, но не до 0.
...
Рейтинг: 0 / 0
09.09.2020, 09:20
    #39996791
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Борис Гаркун,

Раз уж можете создать триггер на таблицу, то получить DDL обеих таблиц с внешними ключами и текущими триггерами на них, думаю, труда не составит. Список полей интересует мало, а вот ключи и триггеры - в студию.
...
Рейтинг: 0 / 0
09.09.2020, 10:48
    #39996822
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Yasha123
Борис Гаркун
Да. В общем подойдет ли мне триггер?

когда вообще все строки исчезают, это скорее всего truncate.
и никакой триггер на delete его не отловит.
а запускать этот truncate можно хоть с линкед сервера,
о котором вы даже не подозреваете.

охота проверить версию с delete?
ну напишите триггер.
но не на первую таблицу, а на ту, из которой строки исчезают.
и логируйте в триггере dbcc inputbuffer включительно


в триггере на второй таблице поставить роллбэк и ждать
...
Рейтинг: 0 / 0
09.09.2020, 12:03
    #39996861
Подойдет ли мне триггер?
env
Раз уж можете создать триггер на таблицу, то получить DDL обеих таблиц с внешними ключами и текущими триггерами на них, думаю, труда не составит. Список полей интересует мало, а вот ключи и триггеры - в студию.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
CREATE TABLE [dbo].[Таблица1](
	[F_Division] [tinyint] NOT NULL,
	[F_Subdivision] [int] NOT NULL,
	[LINK] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
	... другие столбцы
	CONSTRAINT [PK_Таблица1] PRIMARY KEY CLUSTERED 
	(
		[LINK] ASC
	)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95) ON [Data]
) ON [Data]
GO
ALTER TABLE [dbo].[Таблица1] ADD  CONSTRAINT [DF_Таблица1_LINK]  DEFAULT (newid()) FOR [LINK]
GO

CREATE TRIGGER [dbo].[TRD_Таблица1] ON [dbo].[Таблица1]
INSTEAD OF DELETE
/* Опции Merge, Transactional репликации */
/*Opt.1*/NOT FOR REPLICATION
/* Опции Merge, Transactional репликации */
AS 
/* Опции Transactional репликации */
/*Opt.1*/ 
/* Опции Transactional репликации */
--Стандартный триггер для обновления даты модификации записей и идентификатора пользователя.
SET NOCOUNT, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT, XACT_ABORT, CURSOR_CLOSE_ON_COMMIT OFF

DELETE R FROM Таблица2 R INNER JOIN DELETED I ON I.LINK = R.LINK
	
DELETE NI
FROM Таблица1 NI
INNER JOIN DELETED D
	ON D.LINK = NI.LINK
;


А это определение второй таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE [dbo].[Таблица2](
	[F_Networks] [uniqueidentifier] NOT NULL,
	[LINK] [uniqueidentifier] NOT NULL,
... столбцы...
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[LINK_Imp] [varchar](36) NULL,
 CONSTRAINT [PK_Таблица2] PRIMARY KEY NONCLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Indexes]
) ON [Data] TEXTIMAGE_ON [Data]
GO
...
Рейтинг: 0 / 0
09.09.2020, 12:12
    #39996866
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Борис Гаркун,

Интересный триггер, многое объясняет.

упд. Особенно комментарий про назначение понравился.
...
Рейтинг: 0 / 0
09.09.2020, 12:40
    #39996881
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
env
Борис Гаркун,

Интересный триггер, многое объясняет.

упд. Особенно комментарий про назначение понравился.


Радикальная модификация
...
Рейтинг: 0 / 0
09.09.2020, 13:00
    #39996893
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Борис Гаркун,

Выполните код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t1.*, 
       b.Cnt AS [Кол-во привязанных строк во 2-й таблице]
  FROM [Таблица1] AS t1
       OUTER APPLY
					(
						SELECT COUNT(*) AS Cnt
						 FROM [Таблица2] AS t2
						WHERE t2.LINK = t1.LINK
					) AS b;



и станет все ясно без тригеров
...
Рейтинг: 0 / 0
09.09.2020, 14:10
    #39996926
Подойдет ли мне триггер?
env
Интересный триггер, многое объясняет.

по триггеру видно, что по удалению записей в таблице1, удаляются связанные записи из таблицы2. Но как отследить после удаления какой записи таблицы1 таблица 2 оказывается пустой?
Oleg_SQL, не понимаю, зачем мне выполнять ваш запрос. Задача другая
...
Рейтинг: 0 / 0
09.09.2020, 14:38
    #39996939
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Борис Гаркун, мда...


Если у вас в Таблице1, например, 20 записей, а в Таблице2 - 1 миллион и мой запрос покажет на строке с ID = 12 значение [Кол-во привязанных строк во 2-й таблице] = 1 000 000, то и это вам ни о чем не скажет ??


Если же вам нужно именно отследить - создайте таблицу с полем для лога и в том же триггере туда добавляйте информацию
...
Рейтинг: 0 / 0
09.09.2020, 14:45
    #39996940
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Oleg_SQL,

Думаю, можно проще

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
    t.link
    , COUNT(*) AS cnt
FROM
    [Таблица2] AS t
GROUP BY
    t.link
ORDER BY
    cnt DESC
...
Рейтинг: 0 / 0
09.09.2020, 14:53
    #39996946
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
env, а где информация из Таблицы1 ? Если записей больше 20, то по GUID очень "наглядно" будет...
...
Рейтинг: 0 / 0
09.09.2020, 15:10
    #39996958
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Oleg_SQL,

А зачем?
Борис Гаркун
лишь некоторые удаленные записи из таблицы1 удаляют все строки из таблицы2


Значит распределение по полю link в таблице2 очень сильно перекошено в сторону малого числа значений.
...
Рейтинг: 0 / 0
09.09.2020, 17:41
    #39997004
Подойдет ли мне триггер?
Oleg_SQL
Если у вас в Таблице1, например, 20 записей, а в Таблице2 - 1 миллион и мой запрос покажет на строке с ID = 12 значение [Кол-во привязанных строк во 2-й таблице] = 1 000 000, то и это вам ни о чем не скажет ??
Если же вам нужно именно отследить - создайте таблицу с полем для лога и в том же триггере туда добавляйте информацию

Проверил эту гипотезу, такого ассиметричного распределения нет.
Триггер создавал, как отписывался выше, но он почему-то на первой же удаленной строке сразу показал, что удалены все строки в Таблице2, хотя в Таблице2 для этой строки только одна строка. Такое ощущение, что сначала DELETE все намеченное к удалению удалил из Таблицы1, по триггеру на Таблице1 все удалилось из Таблицы2, а потом сервер вспомнил про мой триггер логирования на Таблице1, и в логах отобразилось, что в Таблице2 0 записей, даже на момент удаления первой строки из Таблицы1.
Может ли такое быть? Повлияло ли на такую картину то, что я удалял строки из Таблицы1 в рамках транзакции, или может я неправильно определил триггер логирования? Вот кстати его код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TRIGGER [dbo].[bng_TRD_Таблица1_Log] ON [dbo].[Таблица1]
AFTER DELETE  
	AS 
BEGIN
	SET NOCOUNT, XACT_ABORT, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL ON
	SET NUMERIC_ROUNDABORT, CURSOR_CLOSE_ON_COMMIT OFF

IF ( (SELECT TRIGGER_NESTLEVEL( OBJECT_ID('dbo.TRUD_Таблица1_Log') , 'AFTER' , 'DML' ) ) > 1 ) RETURN 

DECLARE @cnt INT
SET @cnt = (SELECT COUNT(*) FROM dbo.Таблица2)

INSERT dbo.bng_ni_log(LINK, cnt)
SELECT LINK, @cnt
FROM DELETED

END
GO

ALTER TABLE [dbo].[Таблица1] ENABLE TRIGGER [bng_TRD_Таблица1_Log]
GO
...
Рейтинг: 0 / 0
09.09.2020, 19:34
    #39997051
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
авторно он почему-то на первой же удаленной строке сразу показал,
что удалены все строки в Таблице2 ,
хотя в Таблице2 для этой строки только одна строка.
что написал, то он и показал:

Код: sql
1.
2.
DECLARE @cnt INT
SET @cnt = (SELECT COUNT(*) FROM dbo.Таблица2)



посчитал число строк во ВСЕЙ таблице и записал это напротив LINK
и сам же и поверил, что это число записей, соответствующих LINK?

еще раз.
триггер надо вешать на вторую таблицу.
если исчезают все записи, то кто-то предварительно апдэйтит их все, записав туда значение LINK.
одно LINK на всех.
я даже знаю, кто не любит писать условие WHERE,
но не будем тыкать пальцем...

и в триггере на второй таблице в первой же строке вписать
Код: sql
1.
2.
3.
4.
5.
IF @@ROWCOUNT = (SELECT COUNT(*) FROM dbo.Таблица2)
BEGIN
   ROLLBACK;
   RETURN;
END



и перестанут строки исчезать "все сразу"
...
Рейтинг: 0 / 0
09.09.2020, 22:02
    #39997092
Подойдет ли мне триггер?
Yasha123
если исчезают все записи, то кто-то предварительно апдэйтит их все, записав туда значение LINK.
одно LINK на всех.

поясните, где и что апдейтится? в таблице1 у всех обновляется столбец LINK одним и тем же значением?
...
Рейтинг: 0 / 0
09.09.2020, 22:37
    #39997098
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
вы считаете, что удаляется из 2-ой таблицы ***только приведенным триггером***, так?
но в приведенном триггере удаляются только связанные записи.
если удаляются ***все*** строки, то или они вдруг ***все*** стали связанными с одной строкой первой таблицы
(кто-то проапдэйтил вторую таблицу целиком одним и тем же значением, например ВЫ ЖЕ и проапдэйтили)
или хватит уже цепляться к первой таблице и ее триггеру,
логируйте уже триггером на 2-ой таблице dbcc inputbuffer, @@rowcount
...
Рейтинг: 0 / 0
10.09.2020, 21:23
    #39997471
Подойдет ли мне триггер?
Yasha123
логируйте уже триггером на 2-ой таблице dbcc inputbuffer, @@rowcount

Спасибо, Яша.
Что типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TRIGGER [dbo].Триггер ON [dbo].[Таблица2]
FOR DELETE
	AS 
BEGIN
	SET NOCOUNT, XACT_ABORT, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL ON
	SET NUMERIC_ROUNDABORT, CURSOR_CLOSE_ON_COMMIT OFF

	IF ( (SELECT TRIGGER_NESTLEVEL( OBJECT_ID('dbo.Триггер') , 'BEFORE' , 'DML' ) ) > 1 ) RETURN 

	INSERT dbo.bng_nr_log(EventType, Parameters, EventInfo)
	DBCC INPUTBUFFER (@@spid);

	IF @@ROWCOUNT = (SELECT COUNT(*) FROM [dbo].Таблица2)
	BEGIN
	   ROLLBACK;
	   RETURN;
	END
END
GO


?
Ругается на строку в районе DBCC...
Не пойму, как бы еще в INSERT добавить @@rowcount
...
Рейтинг: 0 / 0
10.09.2020, 23:33
    #39997497
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подойдет ли мне триггер?
Поясните пожалуйста, а разве аудит или просто профилером посмотреть на таблицу не поможет понять кто как и зачем обращается к таблице из которой все пропадает?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подойдет ли мне триггер? / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]