Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка при обновлении таблицы на Linked Server из MSSQL  [new]
Sinner
Member

Откуда:
Сообщений: 453
[quot Sinner]Здравствуйте, коллеги. Возникла проблема, копаюсь 2й день не пойму как лечить.
Помогите советом.

Есть база MSSQL v. 2k5. В ней таблица tblClaim:
CREATE TABLE [dbo].[tblClaim](
	[ID] [int] NULL,
	[IssueNumber] [varchar](50) COLLATE Cyrillic_General_CI_AS NOT NULL,
	[DealerID] [int] NOT NULL,
	[ClaimCategory] [int] NULL,
	[DateIssued] [datetime] NULL,
	[VIN] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[ModelName] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[DateRepaired] [datetime] NULL,
	[Odometr] [int] NULL,
	[TroubleComplaint] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[TroubleDefect] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[SubletAmount] [money] NULL,
	[BasicCode] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[SubCode] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[Amount] [money] NULL,
	[TroubleDesc] [varchar](1000) COLLATE Cyrillic_General_CI_AS NULL,
	[TroubleDescEng] [varchar](100) COLLATE Cyrillic_General_CI_AS NULL,
	[Status] [int] NULL,
	[SendStatus] [char](3) COLLATE Cyrillic_General_CI_AS NULL,
	[CheckSumStr] [varchar](32) COLLATE Cyrillic_General_CI_AS NULL,
	[ErrorMessage] [varchar](2000) COLLATE Cyrillic_General_CI_AS NULL,
	[UpdateUser] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[UpdateDate] [smalldatetime] NULL,
	[AttachFile] [varchar](250) COLLATE Cyrillic_General_CI_AS NULL,
        [AttachFile2] [varchar](250) COLLATE Cyrillic_General_CI_AS NULL,
        [AttachFile3] [varchar](250) COLLATE Cyrillic_General_CI_AS NULL,
        [AttachFile4] [varchar](250) COLLATE Cyrillic_General_CI_AS NULL,
        [AttachFile5] [varchar](250) COLLATE Cyrillic_General_CI_AS NULL,
	[DateRegistered] [datetime] NULL,
 CONSTRAINT [PK_tblClaim_1] PRIMARY KEY CLUSTERED 
(
	[IssueNumber] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]



Есть база MySQL v5. В ней таблица tblClaim:

CREATE TABLE `tblClaim` (                         
            `ID` int(11) NOT NULL auto_increment,           
            `IssueNumber` varchar(50) NOT NULL default '',  
            `ClaimCategory` varchar(50) default NULL,       
            `DateIssued` datetime default NULL,             
            `VIN` varchar(50) default NULL,                 
            `ModelName` varchar(50) default NULL,           
            `DateRepaired` datetime default NULL,           
            `Odometr` int(11) default NULL,                 
            `TroubleComplaint` varchar(50) default NULL,    
            `TroubleDefect` varchar(50) default NULL,       
            `SubletAmount` float default NULL,              
            `BasicCode` varchar(50) default NULL,           
            `SubCode` varchar(50) default NULL,             
            `Amount` float default NULL,                    
            `TroubleDesc` varchar(1000) default NULL,       
            `TroubleDescEng` varchar(100) default NULL,     
            `SendStatus` varchar(3) default NULL,           
            `Status` int(11) default NULL,                  
            `DealerID` int(11) default NULL,                
            `UpdateUser` varchar(50) default NULL,          
            `UpdateDate` datetime default NULL,             
            `ErrorMessage` varchar(2000) default NULL,      
            `AttachFile` varchar(250) default NULL,         
            `AttachFile2` varchar(250) default NULL,         
            `AttachFile3` varchar(250) default NULL,         
            `AttachFile4` varchar(250) default NULL,         
            `AttachFile5` varchar(250) default NULL,         
            `DateRegistered` datetime default NULL,         
            PRIMARY KEY  (`ID`)                             
          ) ENGINE=MyISAM DEFAULT CHARSET=cp1251            


Настроен Linked Server "MYSQL" (в ODBC настроен DSN сервера. Опция Return matching Rows выставлена )

в MSSQL Создана VIEW
myClaim:

SELECT     ID, IssueNumber, ClaimCategory, DateIssued, VIN, ModelName, DateRepaired, Odometr, TroubleComplaint, TroubleDefect, SubletAmount, BasicCode, 
                      SubCode, Amount, TroubleDesc, TroubleDescEng, SendStatus, Status, DealerID, UpdateUser, UpdateDate, ErrorMessage, AttachFile, AttachFile2, AttachFile3, AttachFile4, AttachFile5, DateRegistered
FROM         OPENQUERY(MYSQL, 'select * from claim.tblClaim') AS derivedtbl_1

при выполнении запроса в MSSQL (некая процедура синхронизации) на изменение таблицы в MySQL возникает ошибка:
Row cannot be located for updating. Some values may have been changed since it was last read.
Причем запросы как и простые так и сложные приводят к этому эффекту:
update m 
set m.IssueNumber = c.IssueNumber
	, m.DealerID = c.DealerID
	, m.ClaimCategory = c.ClaimCategory
	, m.DateIssued = c.DateIssued
	, m.VIN = c.VIN
	, m.ModelName = c.ModelName
	, m.DateRegistered = c.DateRegistered
	, m.DateRepaired = c.DateRepaired
	, m.Odometr = c.Odometr
	, m.TroubleComplaint = c.TroubleComplaint
	, m.TroubleDefect = c.TroubleDefect
	, m.SubletAmount = c.SubletAmount
	, m.BasicCode = c.BasicCode
	, m.SubCode = c.SubCode
	, m.Amount = c.Amount
	, m.TroubleDesc = c.TroubleDesc
	, m.TroubleDescEng = c.TroubleDescEng
	, m.Status = c.Status
	, m.SendStatus = 'NON'
	, m.UpdateUser = c.UpdateUser
	, m.UpdateDate = c.UpdateDate
	, m.ErrorMessage = c.ErrorMessage
from MyClaim m, tblClaim c 
where c.IssueNumber = '91001001' 
	and 
	(
		m.IssueNumber = '91001001'
		or 
		m.ID = 483
	)

update MyClaim
set VIN = '12345', DateRegistered = 0 
where IssueNumber = '91001001'

оба выдают такую ошибку, но если убрать обновление DateRegistered, то все проходит нормально. Т.е.
update MyClaim set VIN = '12345', DateRegistered = 0 where IssueNumber = '91001001'
выдает указанную ошибку, а
update MyClaim set VIN = '12345' where IssueNumber = '91001001'
нет. Мистика какая-то :(
13 окт 09, 12:17    [7777893]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при обновлении таблицы на Linked Server из MSSQL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
C какой целью создавалась вьюха? Что будет, если UPDATEить непосредственно OPENQUERY? Что будет, если обращение к OPENQUERY заменить на Four-Part Name для линкованной таблицы. Какой запрос (в плане) MS SQL отсылает линкованному MySQL?
13 окт 09, 13:10    [7778233]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при обновлении таблицы на Linked Server из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
А ПК у вашей таблицы в MySQL есть ?
13 окт 09, 13:12    [7778243]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при обновлении таблицы на Linked Server из MSSQL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
И в догонку, а нет ли триггера на таблице в MySQL?
13 окт 09, 13:14    [7778255]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при обновлении таблицы на Linked Server из MSSQL  [new]
Sinner
Member

Откуда:
Сообщений: 453
автор
C какой целью создавалась вьюха? Что будет, если UPDATEить непосредственно OPENQUERY? Что будет, если обращение к OPENQUERY заменить на Four-Part Name для линкованной таблицы. Какой запрос (в плане) MS SQL отсылает линкованному MySQL?


С целью чисто истетической, при тестировании данной ошибки делал UPDATE и view и OPENQUERY.
Вот, запрос упростил до невозможности:
update OPENQUERY(MYSQL1, 'select * from claim.tblClaim')
set VIN = '12345'--, DateRegistered = '20091013' 
where id = 483 

автор
StmtText
------------------------------------------------------------------------------------------------------------------
|--Remote Update(SOURCE:(<UNKNOWN>), OBJECT:(select * from claim.tblClaim), SET:([MSDASQL].[VIN] = [Expr1003]))
|--Compute Scalar(DEFINE:([Expr1003]='12345'))
|--Table Spool
|--Filter(WHERE:([MSDASQL].[ID]=(483)))
|--Remote Scan(SOURCE:(<UNKNOWN>), OBJECT:(select * from claim.tblClaim))

(строк обработано: 5)


Вот план. Для запроса, в котором закомментарен Update поля DateRegistered
и он выполняется, как только включаю его в update - сразу валится вышеозначенная ошибка.

есть одна особенность в обоих таблицах имеются поля ID и ISSUENUMBER
оба уникальны, только ID является PK в MySQL базе, а IssueNumber является PK в MSSQL


автор
А ПК у вашей таблицы в MySQL есть ?


Да, есть PK только это не IssueNumber, a ID

автор
И в догонку, а нет ли триггера на таблице в MySQL?


триггеров нет в принципе.
13 окт 09, 14:30    [7778845]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при обновлении таблицы на Linked Server из MSSQL  [new]
Sinner
Member

Откуда:
Сообщений: 453
В общем выяснил, почему появлялась такая ошибка.
В целевой таблице в MySQL поле DateRegistered было NULL.
Если же поле заполнено каким-то значением, то update проходит нормально.
В общем проблема решена,
но такое поведение OLE DB "MSDASQL" мне осталась неясна.
13 окт 09, 15:48    [7779487]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить