MS SQL Ошибка 14274
ared
После переименования сиквел сервера, при операциях с джобами имеем ошибку:
Cannot add,update,Delete a Job that originated from an MSX Server.

Согласно сапорта микрософта данная ошибка возникает из-за того, что в базе сохраняется имя сервера( вместо локал). Сапорт нам предлагает: переименовать обратно, заскриптовать джобы, дропнуть джобы, дать новое имя серверу и накатить скрип с джобами.
Не очень гармоничное решение, намного проще:[SQL]
USE [msdb]
UPDATE [dbo].[sysjobs]
SET [originating_server]='NEW_NAME_SERVER'
Tags:

MS SQL Linked Server to Oracle
ared
Создал в мсскюл линкед сервер, OLE DB провайдер использовал оракловый не из набора мдак.


1. OLE/DB Provider 'OraOLEDB.Oracle' IUnknown::QueryInterface returned 0x80070005:  Access denied.
Если выполнять из под аутентификации видны.
2. Non-interface error:  CoCreate of DSO for OraOLEDB.Oracle returned 0x80040154
Если использовать стандартного пользователя сиквела (например sa)
3. OLE/DB Provider 'OraOLEDB.Oracle' ICommandText::Execute returned 0x80040155


Помогла статья с сапорта микрософт:
How to set up and troubleshoot a linked server to an Oracle database in SQL Server

В ней есть описание ошибки: Error 7302: Could not create an instance of OLE DB provider 'MSDAORA'

В реестре создаем раздел с именем OLE DB провайдера,

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\OraOLEDB.Oracle
В вновь созданном разделе создаем параметр (DWORD) AllowInProcess со значением 1

После наслаждаемся работой.

Web service
ared
Yii framework

Error на клиенте:
DTD not supported by SOAP
или
Error Featching http header
В  лога апачи: http://www.livejournal.ru/index.php/WebSrv/quote/ws/1 HTTP 500 Time out


Если открыть в браузере то error:
SoapServer::SoapServer(http://www.livejournal.ru/index.php/WebSrv/quote): failed to open stream: Connection timed out


Проблема из скрытия apache за НАТом., смотрим
CWebService.php
155: $server=new SoapServer($this->wsdlUrl,$this->getOptions());

Сервер создается по урл, www.livejournal.ru, соотвественно DNS преобразует имя www.livejournal.ru в 8.8.8.8, а наш сервер натирован  его ip 192.168.1.4.

Проблема решается просто:
на сервере в  /etc/hosts
192.168.1.4 www.livejournal.ru livejournal.ru
Tags: ,

Как баги привращаются в фичи.
ared

Столкнулся с проблемой, при тестировании pdo_oci
PHP Warning: PDOStatement::fetchAll() : column 0 data was too large for buffer and was truncated to fit it.

$dbh = new PDO('oci:dbname=orcl;charset=utf8', 'user', 'pass');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$sth=$dbh->prepare('SELECT \'ПРИВЕТ\' FROM DUAL');
$sth->execute();
$result = $sth->fetchAll(2);
var_dump($result);


Ожидаем результат "ПРИВЕТ" однако имеем только "ПРИ" 

проверяем в OCI8

$conn = oci_connect('orcl', 'user', 'pass');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT \'ПРИВЕТ\' FROM DUAL');
oci_execute($stid);
$nrows = oci_fetch_all($stid, $res);
var_dump($res);

Ожидаеммы  и полученный результат "ПРИВЕТ".

Как бы все ясно проблема в PDO пытаемся лечить, одно из достоинств опенсоурс наличие исходников, читаем. И находим удивительную фичу  OCI8 работает потому что в нем бага:
если глянуть OCI8 php_oci_statement_execute
То  там размер буфера для данных с OCI_ATTR_DATA_SIZE,
И далее перед выделением 
памяти ошибочно (а может и на намерено ) умножается на 3
else {
outcol->storage_size4++; /* add one for string terminator */
}
outcol->storage_size4 *= 3;
dynamic = OCI_DEFAULT;
buf = outcol->data = (text *) safe_emalloc(1, outcol->storage_size4, 0);
memset(buf, 0, outcol->storage_size4);
break;

В PDO_OCI oci_stmt_describe Все корректно оркл сказал 6 значить 6+1

else {
S->cols[colno].datalen = col->maxlen;
}
if (dtype == SQLT_BIN) {
S->cols[colno].datalen *= 3;
}
S->cols[colno].data = emalloc(S->cols[colno].datalen + 1);
dtype = SQLT_CHR;



Тобишь OCI8  вместо 6+1 ошибочно выделил 21=(6+1)*3 байта и мы имеем ожидаемый результат, а PDO_OCI сделал все верно выделил 7 байт и ожидаемый результат обрезан был обрезан. Так как строка в уникоде.   Просто функция OCIAttrGet OCI_ATTR_DATA_SIZE возвращает размер данных в байтах без учета локальной кодировки.

?

Log in