Удаление записей из MySql с помощью SSIS

Я пытаюсь удалить (и обновить, но если я смогу удалить, то смогу обновить) данные продукта из базы данных веб-сайта MySQL с помощью SSIS, когда эти продукты были отмечены в нашей ERP (и в базе данных sql server используется для отчетности) как прекращено. Я пробовал следующее:

Первая попытка: Сохранение строк, подлежащих удалению, в набор записей и использование цикла for-each с задачей выполнения sql для их удаления как описано здесь.

Результат: Частично работает, но работает очень медленно и дает сбой примерно после 500 удалений каждый раз. Это заставляет меня задуматься, есть ли в базе данных MySql какая-то функция защиты от хакеров.


Вторая попытка: Преобразование первичного ключа для всех строк, подлежащих удалению, в строковую переменную, разделенную запятыми, с использованием FOR XML PATH: как описано здесь (или, скорее, их серии из-за ограничения в 4000 символов).

Код выбора SQL (отлично работает)

WITH CTE (Product_sku,rownumber) AS 
(
    SELECT product_sku 
    , row_number() over(order by product_sku) 
    FROM product_updates
    WHERE action = 'delete'
)

SELECT 
Delete1= cast(
    (SELECT TOP 1 
    STUFF(
        (SELECT ',''' + product_sku+'''' FROM CTE 
        WHERE cte.RowNumber BETWEEN 1 and 700 
        FOR XML PATH (''))
    , 1, 1, '') ) 
    AS varchar(8000))

... and nine more of these select statements into additional variables to allow for larger delete operations.

А затем используя этот результат для удаления записей из MySql с помощью команды Execute SQL со следующим кодом:

DELETE FROM datarepo.product
WHERE product_sku in (?)

Результат: Пакет выполнен, но ничего удалить не удалось. При просмотре файла журнала запросов MySql я увидел следующее, в котором говорится, почему ничего не удалось удалить.

DELETE FROM datarepo.product 
WHERE product_sku in ('\'')

Обратите внимание, что этот же оператор SSIS Execute SQL при использовании жестко заданных значений (например, следующих) удаляет просто отлично.

DELETE FROM datarepo.product 
WHERE product_sku in ('1234','5678','abcd', etc...)

Мне не удалось найти ничего другого в Интернете. Как сказал Реза Рад в первом сообщении по ссылке, трудно найти материал об использовании SSIS для выполнения операций с MySql.

Ты идешь правильным путем. Самый простой способ - вставить коды продуктов в mysql в новую созданную таблицу с одним столбцом, а в SSIS 'SQL Task' просто присоединиться к таблицам и удалить эти записи ... Если это невозможно, я, вероятно, сгенерирую sql-запрос с SKU и используя «SQL Task», как вы будете его генерировать, зависит от того, что будет работать, а что нет. Вероятно, вам нужно использовать переменную SSIS, есть ограничение, проверьте Интернет на предмет обхода, я думаю, должно быть решение. Это не ответ, просто решение, куда идти.

Justin 11.09.2018 11:15

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

Jeremiah 12.09.2018 03:33
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
133
0

Другие вопросы по теме