Прошу прощения за некрофилию, сам мигрирую с 5 на 6. Столкнулся с той же проблемой - разобрался. Статьи шестерка пишет в Base64 (столбец article_data_mime_attachment.content), а пятерка держит их первозданном виде (столбец article_attachment.content). Возможно это не всегда так и зависит от каких то настроек (не нашел, но и не сильно искал). Решение простое - закодировать статьи пятерки в Base64.
Еще раз прошу прощения, за отсутствие конкретики в виде sql скриптов. Не делюсь, потому что извращенец – хочу ms sql server на линуксе. Для него могу поделиться скриптами - пишите в личку.
Шучу (не не насчет ms sql). И сильно не пинать, я не dba.
Код: Выделить всё
-- В линуксе на сколько я понял (могу глубоко заблуждаться) нельзя linkedserver. Поэтому базу готовлю на винде.
EXEC master.dbo.sp_addlinkedserver @server = N'otrs_current', @srvproduct=N'MySQL', @provider=N'MSDASQL', @provstr=N'Driver={MySQL ODBC 8.0 ANSI Driver};DATABASE={имя вашей отрс базы};OPTION=134217728;PWD{пароль к ней же}=;UID={имя пользователя};SERVER={имя/ip сервера}'
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'rpc', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'rpc out', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'otrs_current', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO
Код: Выделить всё
CREATE FUNCTION [dbo].[get_otrs_content](@otrs_content VARBINARY(MAX))
RETURNS VARBINARY(MAX) AS
BEGIN
Declare @content VARCHAR(MAX)
Declare @result VARCHAR(MAX)
SET @content = CAST(@otrs_content as VARCHAR(MAX))
IF (SELECT CAST(N'' as xml).value('xs:base64Binary(sql:variable("@content"))', 'VARCHAR(MAX)')) IS NULL BEGIN
SET @result = CAST(N'' as xml).value('xs:base64Binary(sql:variable("@otrs_content"))', 'VARCHAR(MAX)')
END
ELSE BEGIN
SET @result = @otrs_content
END
RETURN CAST(@result as VARBINARY(MAX));
END;
Код: Выделить всё
CREATE PROCEDURE [dbo].[sp_merge_article_data_mime_attachment]
AS
BEGIN
SET IDENTITY_INSERT article_data_mime_attachment ON;
MERGE article_data_mime_attachment AS target
USING (
SELECT
id
,article_id
,filename
,content_size
,content_type
,content_id
,content_alternative
,disposition
,dbo.get_otrs_content(content) AS content
,dbo.get_otrs_time(create_time) AS create_time
,create_by
,dbo.get_otrs_time(change_time) AS change_time
,change_by
FROM openquery(otrs_current,'SELECT * FROM article_attachment') AS article
) AS source
ON (target.id = source.id)
WHEN MATCHED AND (
target.article_id <> source.article_id
OR target.filename <> source.filename
OR target.content_size <> source.content_size
OR CAST(target.content_type AS VARCHAR(MAX)) <> CAST(source.content_type AS VARCHAR(MAX))
OR target.content_id <> source.content_id
OR target.content_alternative <> source.content_alternative
OR target.disposition <> source.disposition
OR target.content <> source.content
OR target.create_time <> source.create_time
OR target.create_by <> source.create_by
OR target.change_time <> source.change_time
OR target.change_by <> source.change_by
)
THEN
UPDATE SET
article_id = source.article_id
,filename = source.filename
,content_size = source.content_size
,content_type = source.content_type
,content_id = source.content_id
,content_alternative = source.content_alternative
,disposition = source.disposition
,content = source.content
,create_time = source.create_time
,create_by = source.create_by
,change_time = source.change_time
,change_by = source.change_by
WHEN NOT MATCHED BY TARGET THEN
INSERT (
id
,article_id
,filename
,content_size
,content_type
,content_id
,content_alternative
,disposition
,content
,create_time
,create_by
,change_time
,change_by
) VALUES (
source.id
,source.article_id
,source.filename
,source.content_size
,source.content_type
,source.content_id
,source.content_alternative
,source.disposition
,source.content
,source.create_time
,source.create_by
,source.change_time
,source.change_by
)
OUTPUT $action,Inserted.*,Deleted.*;
SET IDENTITY_INSERT article_data_mime_attachment OFF;
END;
Код: Выделить всё
-- Тадам!
EXECUTE [sp_merge_article_data_mime_attachment];
Вопросы, пожелания, предложения?