ODBC SELECT 权限被拒绝

ODBC SELECT permission denied

我想在我的 PHP 网站上打印一份基本的 "SELECT * FROM Kunde"

出现以下错误:

Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 229 [code] => 229 [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The SELECT permission was denied on the object 'Kunde', database 'Test_DB', schema 'dbo'. [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The SELECT permission was denied on the object 'Kunde', database 'Test_DB', schema 'dbo'. ) )

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

编辑 1:

<?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 );
?>

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

您需要执行以下操作:

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

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

<?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);
?>