odbc_pconnect有效,但PDO错误

时间:2016-03-17 09:25:33

标签: php pdo sybase freetds unixodbc

我通过CentOS服务器上的unixODBC和FreeTDS建立了与Sybase DB的连接。 (我不拥有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] at /builddir/build/BUILD/php-5.4.16/ext/pdo_odbc/odbc_stmt.c:254)

好吧,正如您所看到的,我的查询不会尝试创建任何过程

我尝试了不同的连接字符串,但结果没有改变

我想问题出在我的odbc和freeTDS配置中,而不是在PHP中。但问题仍然存在:为什么不同的行为?

编辑我发现同样的问题是尝试从consolle访问数据源:如果我尝试使用tsql

tsql -S myDSN -U myusername -P mypassword

我可以执行查询。但是当我使用isql访问时:

isql -v myDSN myusername mypassword 

我得到了与上面相同的错误:

  

[42501] [FreeTDS] [SQL Server] ASA错误-121:权限被拒绝:您无权使用" CREATE PROCEDURE"声明   [ISQL]错误:无法执行SQLExecute

我猜这与this

有关

PS 我正在使用cakephp 3.1.11

1 个答案:

答案 0 :(得分:0)

您可能无法创建程序,但CakePHP可能会在后台为您执行此操作。如果您只具有读取权限,则无法创建过程source

  

以下介绍了根据您的细化权限设置而有所不同的创建过程(在创建扩展过程时)的权限检查。:

     

启用了细化权限 - 您必须具有create procedure特权。您必须具有create any procedure特权才能为其他用户运行create procedure。

     

禁用了细化权限 - 您必须是数据库所有者或具有create procedure特权。