我通过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
答案 0 :(得分:0)
您可能无法创建程序,但CakePHP可能会在后台为您执行此操作。如果您只具有读取权限,则无法创建过程source:
以下介绍了根据您的细化权限设置而有所不同的创建过程(在创建扩展过程时)的权限检查。:
启用了细化权限 - 您必须具有create procedure特权。您必须具有create any procedure特权才能为其他用户运行create procedure。
禁用了细化权限 - 您必须是数据库所有者或具有create procedure特权。