ODB C SELECT отказано в разрешении - PullRequest
0 голосов
/ 23 марта 2020

Я хочу, чтобы на моем PHP веб-сайте была распечатана базовая c "SELECT * FROM Kunde".

Получена следующая ошибка:

Array ([0] => Array ([0] => 42000 [SQLSTATE] => 42000 [1] => 229 [код] => 229 [2] => [Microsoft] [ODB C Драйвер 17 для SQL Сервер] [SQL Server] Разрешение SELECT было отклонено для объекта «Kunde», базы данных «Test_DB», схемы «dbo». [Message] => [Microsoft] [ODB C Драйвер 17 для SQL Сервер] [SQL Сервер] The Отказано в разрешении SELECT для объекта «Kunde», базы данных «Test_DB», схемы «dbo».))

Система: Win2016, SQL Server 2017, PHP 7.4.3, sqlsrv модуль и odb c 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 );
?>

1 Ответ

0 голосов
/ 23 марта 2020

Вы пытаетесь подключиться к SQL Серверу, используя windows аутентификацию. В этой ситуации для подключения к серверу используется идентификатор процесса или идентификатор потока веб-сервера (если веб-сервер использует олицетворение). Когда вы выполняете этот оператор в инструменте клиента (SQL Server Management Studio), вы используете идентификацию конечного пользователя.

Вам необходимо сделать следующее:

  • grant разрешения для идентификации процесса веб-сервера или
  • использование 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);
?>
...