powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SSIS (исключить задваивание строк в получателе)
24 сообщений из 24, страница 1 из 1
SSIS (исключить задваивание строк в получателе)
    #39920316
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!
Есть источник табличка на serv1 , есть получатель табличка на serv2 (оба сервера MsSql). Проливаю из serv1 в serv2 строки каждые 15 минут из табличку в табличку. В настройках получателя - поставил галочки (контролировать нарушения , лочить табличку). Написал тригер (INSTEAD OF INSERT) на табличке получателе, которые будет игнорировать уже вставленные строки...
Но, всё равно дубли проскакивают! :-(
Читал, подход, что можно делать буферные таблички на получателе в них вставлять всё, а потом merge с основной таблицей, но что то не хочется замусоривать базу.

Есть ли какой нить not exists в самом SSIS, помогите плиз!?
П.С. линкованные сервера не предлагать, я о т них ухожу...
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920359
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed
Есть ли какой нить not exists в самом SSIS, помогите плиз!?

компонент "соединение слиянием" в руссифицированном SSIS (какой-то из "merge" в англ.)
В нём выбираешь нужное соединение 2-х наборов (LEFT к получателю) и, через "условное разбиение", отправляешь на вставку только записи отсутствующие в получателе (isnull(DestKeyField))

Без триггеров и прочих "приседаний"
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920374
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed

Читал, подход, что можно делать буферные таблички на получателе в них вставлять всё, а потом merge с основной таблицей, но что то не хочется замусоривать базу.



Делать так и никак иначе. И это не мусор, а правильная архитектура хранилища данных или ODS.

Здесь еще вопрос целостности и транзакций. Сначала вы получаете порцию в буфер, вы уверены, что это полная порция от начала и до конца.

Потом вы можете MERGE или DELETE INSERT делать в транзакции. Вы будете уверены, что ничего не потеряете.

А что будет, если вы вставляете напрямую и загрузка упадет?
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920381
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

Я делал схему аналогично вашей, но что будет, если загрузка рухнет по середине?

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

Тут вопрос о том, заботитесь ли о целостности транзакции.
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920384
vborets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще использовать Lookup в таблице приемнике и вставлять несовпадения.
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920385
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vborets
Проще использовать Lookup в таблице приемнике и вставлять несовпадения.

Можно поподробнее, что за компонента?
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920387
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
court,

Я делал схему аналогично вашей, но что будет, если загрузка рухнет по середине?

Тут вопрос о том, заботитесь ли о целостности транзакции.

Дозальётся следующей итерацией, разве нет?
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920398
vborets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed,

По-русски "Уточняющий запрос"
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920412
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed
a_voronin
court,

Я делал схему аналогично вашей, но что будет, если загрузка рухнет по середине?

Тут вопрос о том, заботитесь ли о целостности транзакции.

Дозальётся следующей итерацией, разве нет?



Не факт. Зависит от того как вы порцию выбираете и в какой последовательности записи идут.

Вы забирали 1000 записей. Загрузка упала. Есть ли гарантия, что вы взяли первые 500. Вот для этого и нужен буфер, чтобы вы знали, что в буфер все 1000 пришли и только потом начинать апдейтить целевые данные.

Тут вы зависите от логики драйвера, который работает в destination. есть ли у него гарантия, что он вставит ровно первые 500 строк. Да и поступали ли из источника данные в отсортированном виде.
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920414
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed
vborets
Проще использовать Lookup в таблице приемнике и вставлять несовпадения.

Можно поподробнее, что за компонента?


Не прокатит на большом объеме и не есть хорошее решение по сравнению с Merge.

SCD блок тоже производительностью не блещет.
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920418
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
medoed
пропущено...

Можно поподробнее, что за компонента?


Не прокатит на большом объеме и не есть хорошее решение по сравнению с Merge.

SCD блок тоже производительностью не блещет.

У меня за раз не более 1000 строк проливается, так что хочу попробовать...
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920443
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vborets
medoed,

По-русски "Уточняющий запрос"

Понял смастерил, только теперь ругачка не могу вкурить, о чём она ?! (((

lookup transform must contain at least one input column joined to a reference columnlookup transform must contain at least one input column joined to a reference column
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920454
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed,

Lookup используем для обменов, которые в постоянке (т.е. не большими порциями)

а для заливки данных раз в сутки - как a_voronin: буферные таблицы
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920458
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavy
medoed,

Lookup используем для обменов, которые в постоянке (т.е. не большими порциями)

а для заливки данных раз в сутки - как a_voronin: буферные таблицы

Я подливаю ежедневно (каждые 15 минут) свежие записи только за день, их кол-во за день не более 5000 , а за (новых) раз не более 500.
Но думаю, верхняя ругачка о другом!
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920467
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed,
когда мне лень, я делаю уникальный индекс с опцией "игноре дуп кей"
если нужно проверить на соответствие всех столбцов, то сделать вычисляемое поле с binary_checksum по всем полям и по нему индекс
Но я чаще всего делаю через буферные таблицы
ЗЫЖ нужно учитывать, что при больших объемах binary_checksum может выдавать одинаковый результат
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920468
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed,

авторНаписал тригер (INSTEAD OF INSERT) на табличке получателе, которые будет игнорировать уже вставленные строки...

Надо создать уникальный индекс с ignore_dup_key, обычно создает меньше проблем.
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920472
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot
medoed,
когда мне лень, я делаю уникальный индекс с опцией "игноре дуп кей"
если нужно проверить на соответствие всех столбцов, то сделать вычисляемое поле с binary_checksum по всем полям и по нему индекс
Но я чаще всего делаю через буферные таблицы
ЗЫЖ нужно учитывать, что при больших объемах binary_checksum может выдавать одинаковый результат

Спасибо попробую!
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920474
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
medoed,

авторНаписал тригер (INSTEAD OF INSERT) на табличке получателе, которые будет игнорировать уже вставленные строки...


Надо создать уникальный индекс с ignore_dup_key, обычно создает меньше проблем.

А в чем проблема вставить в буфер и написать правильно MERGE и иметь иметь индекс только по первичному ключу? И не париться со всеми остальными костылями, что вы тут городите.

Код: 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.
		MERGE [Stage].[DestTable] AS target
		USING (
			SELECT * FROM Buffer_Table -- при необходимости убрать дубли через ROW_NUMBER
		) AS source 
		ON (
			 target.[No_] = source.[No_]
		)
		WHEN MATCHED 
			AND (
				(target.[Sex] <> source.[Sex]) OR (target.[Sex] IS NULL AND source.[Sex] IS NOT NULL) OR (target.[Sex] IS NOT NULL AND source.[Sex] IS NULL)
				OR (target.[Birth Date] <> source.[Birth Date]) OR (target.[Birth Date] IS NULL AND source.[Birth Date] IS NOT NULL) OR (target.[Birth Date] IS NOT NULL AND source.[Birth Date] IS NULL)
			)
		THEN UPDATE SET 
			 [Sex] = source.[Sex]
			,[Birth Date] = source.[Birth Date]

		WHEN NOT MATCHED THEN 
		INSERT 
		(
			 [No_]
			,[Sex]
			,[Birth Date]
		)
		VALUES
		(
			 [No_]
			,[Sex]
			,[Birth Date]
		)

...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920477
vborets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed
vborets
medoed,

По-русски "Уточняющий запрос"

Понял смастерил, только теперь ругачка не могу вкурить, о чём она ?! (((

lookup transform must contain at least one input column joined to a reference columnlookup transform must contain at least one input column joined to a reference column


Надо соединить входящий столбец со столбцом в котором ищется совпадение.
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920484
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
medoed,

авторНаписал тригер (INSTEAD OF INSERT) на табличке получателе, которые будет игнорировать уже вставленные строки...


Надо создать уникальный индекс с ignore_dup_key, обычно создает меньше проблем.
Вообщем то вставляет записи , но валится с ошибкой SSIS пакет:

An OLE DB record is available. Source: "Microsoft OLE DB Provider for SQL Server" Hresult: 0x80004005 Description: "Duplicate key was ignored."
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920487
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vborets
medoed
пропущено...

Понял смастерил, только теперь ругачка не могу вкурить, о чём она ?! (((

lookup transform must contain at least one input column joined to a reference columnlookup transform must contain at least one input column joined to a reference column


Надо соединить входящий столбец со столбцом в котором ищется совпадение.

Спасибо, да сделал. Но почему то зависает в бесконечность на этапе слияния. Буду дебажить Sql Server Profiler, что за запрос идёт на сервер...
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920496
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medoed
Владислав Колосов
medoed,

пропущено...


Надо создать уникальный индекс с ignore_dup_key, обычно создает меньше проблем.

Вообщем то вставляет записи , но валится с ошибкой SSIS пакет:

An OLE DB record is available. Source: "Microsoft OLE DB Provider for SQL Server" Hresult: 0x80004005 Description: "Duplicate key was ignored."

поставьте блокирование проброса ошибки на этом шаге пакета SSIS - как погасить ошибку в задаче?
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920524
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot
medoed
пропущено...

Вообщем то вставляет записи , но валится с ошибкой SSIS пакет:

An OLE DB record is available. Source: "Microsoft OLE DB Provider for SQL Server" Hresult: 0x80004005 Description: "Duplicate key was ignored."

поставьте блокирование проброса ошибки на этом шаге пакета SSIS - как погасить ошибку в задаче?

Спасибо! Думаю поможет, у меня пакет расширение SSIS слетело к VS 2019 Community. Эх что то сплошная невезуха! :-(
...
Рейтинг: 0 / 0
SSIS (исключить задваивание строк в получателе)
    #39920687
Фотография medoed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot,
Всё восстановил и пролилось теперь.
Огромное спасибо, хрен так найдёшь эту опцию или гуглить пол дня, как загасить это предупреждение!
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SSIS (исключить задваивание строк в получателе)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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