Я установил соединение с БД Sybase через unixODBC и FreeTDS на сервере CentOS. (У меня нет сервера Sybase, и у меня просто есть учетная запись с разрешениями только на чтение)
TL; DR: Я могу соединиться как с odbc_pconnect
и PDO, но когда я выполняю тот же запрос odbc_pconnect
работает пока PDO возвращает ошибку
Полная история: я создал простой тест, используя odbc_pconnect
$query = "select COUNT(*) from table_name";
$conn = odbc_pconnect("myDSN", 'myusername', 'mypassword');
if(!$conn)
die("Connection failed");
if($result = odbc_exec($conn, $query))
{
odbc_result_all($result);
}
Приведенный выше код работает, и я получаю количество, которое я хочу.
Затем я попытался с помощью PDO
$connectionstring = "odbc:myDSN;";
try {
$db = new \PDO(
$connectionstring , 'myusername', 'mypassword');
} catch (PDOException $e)
{
echo 'Connection failed: ' . $e->getMessage();
}
$rs = $db->query($query);
debug($db->errorInfo());
Соединение установлено (без ошибки «ошибка подключения»), но затем сервер возвращает ошибку:
[FreeTDS] [SQL Server] Ошибка ASA -121: в доступе отказано:
у вас нет разрешения на использование инструкции «CREATE PROCEDURE»
(SQLExecute [262] в /builddir/build/BUILD/php-5.4.16/ext/pdo_odbc/odbc_stmt.c:254)
ну, как вы можете видеть, мой запрос не пытается создать какую-либо процедуру
Я пробовал разные строки подключения, но результат не меняется
Я думаю, проблема в моей конфигурации odbc и freeTDS, а не в PHP. Но все же остается вопрос: почему разное поведение?
редактировать Я обнаружил ту же проблему, пытаясь получить доступ к источнику данных из консоли: если я попытаюсь с tsql
tsql -S myDSN -U myusername -P mypassword
Я могу выполнить запрос. Но когда я получаю доступ с помощью isql
:
isql -v myDSN myusername mypassword
Я получаю ту же ошибку, что и aobove:
[42501] [FreeTDS] [SQL Server] Ошибка ASA -121: разрешение отклонено: у вас нет разрешения на использование инструкции «CREATE PROCEDURE»
[ISQL] ОШИБКА: не удалось выполнить SQLExecute
Я думаю, это связано с этот
PS
Я использую CakePHP 3.1.11
Вы не можете создавать процедуры, но CakePHP может сделать это в фоновом режиме для вас. Если у вас есть только права на чтение, вы не можете создавать процедуры, источник:
Далее описываются проверки разрешений для процедуры создания (также при создании расширенной процедуры), которые различаются в зависимости от ваших детальных настроек разрешений.
Разрешены гранулярные разрешения — у вас должна быть привилегия создания процедуры. У вас должна быть привилегия создания любой процедуры для запуска процедуры создания для других пользователей.
Детальные разрешения отключены — вы должны быть владельцем базы данных или иметь привилегию процедуры создания.
Других решений пока нет …