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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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


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

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

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


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

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

У меня за раз не более 1000 строк проливается, так что хочу попробовать...
...
Рейтинг: 0 / 0
30.01.2020, 12:36
    #39920443
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
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
30.01.2020, 12:48
    #39920454
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
medoed,

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

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

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

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

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

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

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

Спасибо попробую!
...
Рейтинг: 0 / 0
30.01.2020, 13:22
    #39920474
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
Владислав Колосов
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
30.01.2020, 13:31
    #39920477
vborets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
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
30.01.2020, 13:45
    #39920484
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
Владислав Колосов
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
30.01.2020, 13:49
    #39920487
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
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
30.01.2020, 14:06
    #39920496
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
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
30.01.2020, 15:01
    #39920524
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
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
30.01.2020, 19:30
    #39920687
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS (исключить задваивание строк в получателе)
HandKot,
Всё восстановил и пролилось теперь.
Огромное спасибо, хрен так найдёшь эту опцию или гуглить пол дня, как загасить это предупреждение!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SSIS (исключить задваивание строк в получателе) / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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