ODBC SELECT权限被拒绝

时间:2020-03-23 12:46:41

标签: php sql-server odbc sqlsrv

我希望在我的PHP网站上打印出基本的"SELECT * FROM Kunde"

收到以下错误:

Array([0] => Array([0] => 42000 [SQLSTATE] => 42000 [1] => 229 [代码] => 229 [2] => [Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL 服务器]对对象'Kunde'的SELECT权限被拒绝, 数据库“ Test_DB”,架构“ dbo”。 [消息] => [Microsoft] [ODBC驱动程序 17 for SQL Server] [SQL Server]对SELECT权限被拒绝 对象“ Kunde”,数据库“ Test_DB”,模式“ dbo”。 )

系统:安装了Win2016,SQL Server 2017,PHP 7.4.3,sqlsrv模块和odbc 17,连接到sql server succesfull,sql查询(SELECT * FROM Kunde)在SSMS中有效,我为自己授予了所有可能的权限可能的SQL对象...

Edit1:

<?php


// Create connection
$servername = "servername\SQLEXPRESS";
$dbname = "Test_DB";
$connectionInfo = array( "Database"=>"Test_DB");

$conn = sqlsrv_connect($servername, $connectionInfo);

if( $conn === false ) {
     die( print_r( sqlsrv_errors(), true));
}

if( $client_info = sqlsrv_client_info( $conn)) {
    foreach( $client_info as $key => $value) {
        echo $key.": ".$value."<br />";
    }
}
echo "<br>";

$server_info = sqlsrv_server_info( $conn);
if( $server_info )
{
    foreach( $server_info as $key => $value) {
       echo $key.": ".$value."<br />";
    }
} else {
      die( print_r( sqlsrv_errors(), true));
}

echo "<br>";

//Show DB

$sql = "SELECT * FROM dbo.Kunde";
$stmt = sqlsrv_query($conn, $sql);

if( $stmt === false ) {
     die( print_r( sqlsrv_errors(), true));
}


sqlsrv_close( $conn );
?>

1 个答案:

答案 0 :(得分:0)

您正在尝试使用windows身份验证连接到SQL Server。在这种情况下,将使用Web服务器的进程标识或线程标识(如果Web服务器正在使用模拟)来连接到服务器。在客户端工具(SQL Server Management Studio)中执行此语句时,您使用的是最终用户的身份。

您需要执行以下操作:

  • 授予对Web服务器的进程标识的权限,或
  • 使用sql身份验证连接到SQL Server

使用此简单脚本,您可以获得尝试连接到服务器的用户名:

<?php
$server = 'servername\SQLEXPRESS';
$cinfo = array(
    "Database"=>'Test_DB'
);
$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}
$sql = 
    "SELECT 'SUSER_SNAME' AS [NAME], CONVERT(nvarchar(128), SUSER_SNAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'SUSER_NAME' AS [NAME], CONVERT(nvarchar(128), SUSER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_NAME' AS [NAME], CONVERT(nvarchar(128), USER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_ID' AS [NAME], CONVERT(nvarchar(128), USER_ID()) AS [VALUE]";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false ) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['NAME'].": ".$row['VALUE']."</br>";
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>