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);
?>
我想在我的 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);
?>