powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подойдет ли мне триггер?
25 сообщений из 26, страница 1 из 2
Подойдет ли мне триггер?
    #39996618
Здравствуйте!

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

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


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

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


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

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


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

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

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

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

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

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

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

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

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


в триггере на второй таблице поставить роллбэк и ждать
...
Рейтинг: 0 / 0
Подойдет ли мне триггер?
    #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
Подойдет ли мне триггер?
    #39996866
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун,

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

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

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

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


Радикальная модификация
...
Рейтинг: 0 / 0
Подойдет ли мне триггер?
    #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
Подойдет ли мне триггер?
    #39996926
env
Интересный триггер, многое объясняет.

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


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


Если же вам нужно именно отследить - создайте таблицу с полем для лога и в том же триггере туда добавляйте информацию
...
Рейтинг: 0 / 0
Подойдет ли мне триггер?
    #39996940
Фотография 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
Подойдет ли мне триггер?
    #39996946
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env, а где информация из Таблицы1 ? Если записей больше 20, то по GUID очень "наглядно" будет...
...
Рейтинг: 0 / 0
Подойдет ли мне триггер?
    #39996958
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_SQL,

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


Значит распределение по полю link в таблице2 очень сильно перекошено в сторону малого числа значений.
...
Рейтинг: 0 / 0
Подойдет ли мне триггер?
    #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
Подойдет ли мне триггер?
    #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
Подойдет ли мне триггер?
    #39997092
Yasha123
если исчезают все записи, то кто-то предварительно апдэйтит их все, записав туда значение LINK.
одно LINK на всех.

поясните, где и что апдейтится? в таблице1 у всех обновляется столбец LINK одним и тем же значением?
...
Рейтинг: 0 / 0
Подойдет ли мне триггер?
    #39997098
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы считаете, что удаляется из 2-ой таблицы ***только приведенным триггером***, так?
но в приведенном триггере удаляются только связанные записи.
если удаляются ***все*** строки, то или они вдруг ***все*** стали связанными с одной строкой первой таблицы
(кто-то проапдэйтил вторую таблицу целиком одним и тем же значением, например ВЫ ЖЕ и проапдэйтили)
или хватит уже цепляться к первой таблице и ее триггеру,
логируйте уже триггером на 2-ой таблице dbcc inputbuffer, @@rowcount
...
Рейтинг: 0 / 0
Подойдет ли мне триггер?
    #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
Подойдет ли мне триггер?
    #39997497
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясните пожалуйста, а разве аудит или просто профилером посмотреть на таблицу не поможет понять кто как и зачем обращается к таблице из которой все пропадает?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подойдет ли мне триггер?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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