1

SQL サーバーから MySql サーバーのデータにアクセスしようとすると、問題に直面しています。これが私がこれまでに行ったことです。
1) SQL Server に MySQL ODBC Driver 5.2w をインストールしました 2) このサイトの指示に従って、Microsoft SQL Server Managment S (MSQLSMS) からリンク サーバーを作成しました http://sql-articles.com/blogs/creating-linked- server-to-mysql-from-sql-server/

MSQLSMS で「SERV1」というサーバーへの接続を開き、次のクエリを実行しましたが、問題なく動作しています。

SELECT
p.team_name,
p.fullname,
SUM( ISNULL(i.CallDurationSeconds, 0) ) AS totalTime
FROM OPENQUERY(SERVPHP, 'SELECT
                        CAST(t.name AS CHAR) AS team_name,
                        CAST(TRIM(REPLACE(CONCAT(su.first_name, " ", su.middle_name , " ", su.last_name), " ", " ")) AS CHAR) AS fullname,
                        CAST(su.login_user AS CHAR) AS username,
                        CAST(p.account_id AS UNSIGNED) AS account_id
                        FROM call_managment_system.phone_calls AS p
                        INNER JOIN call_managment_system.users AS su ON p.owner_id = su.user_id
                        INNER JOIN call_managment_system.teams AS t ON su.team_id = t.team_id
                        WHERE p.status = 2 AND t.client_id = 1 AND p.last_attempt_on BETWEEN "2013-01-01 08:00:00" AND "2013-04-30 07:00:00"
                        GROUP BY t.team_id, p.owner_id') AS p
INNER
JOIN OPENQUERY(SERVPHP, 'SELECT
                        CAST(cn.contact_number AS CHAR) AS phone_number,
                        CAST(cn.account_id AS UNSIGNED) AS account_id
                        FROM call_managment_system.contact_numbers AS cn
                        WHERE cn.contact_link = "Account"
                        UNION
                        SELECT CAST(cn2.contact_number AS CHAR) AS phone_number,
                        CAST(cn2.account_id AS UNSIGNED) AS account_id
                        FROM call_managment_system.contact_personal AS cp
                        INNER JOIN call_managment_system.contact_numbers AS cn2 ON cn2.person_id = cp.person_id AND cn2.contact_link = "Account" ') AS cn ON cn.account_id = p.account_id
INNER
JOIN I3_IC.dbo.CallDetail AS i ON p.username = i.LocalUserId AND RIGHT(i.RemoteNumber, 10) = cn.phone_number
WHERE i.I3TimeStampGMT BETWEEN '2013-01-01 08:00:00' AND '2013-04-30 07:00:00'
GROUP BY p.team_name, p.fullname

今、私はPHPを使用してこのクエリを実行しています。私は次のことを行いました1)PDO APIを使用して、以前にこのクエリを実行したSQLサーバー「SERV1」に接続します。2) 上記と同じクエリを実行してみてください。しかし、今回は解決できないエラーが発生します。

致命的なエラー: キャッチされない例外 'PDOException' とメッセージ 'SQLSTATE[42000]: [Microsoft][SQL Server Native Client 10.0][SQL Server] リンク サーバー "SERVPHP" の OLE DB プロバイダー "MSDASQL" のデータ ソース オブジェクトを初期化できません

「SERVPHP」は、PHP アプリケーションが実行され、MySql サーバーが実行されているサーバーであることに注意してください。SQL サーバーが実行されていて、ODBC ドライバーをインストールした場所の場合は「SERV1」。

さらに、このクエリを PHP アプリケーションから同じ方法で実行すると、動作します

SELECT
LocalUserId AS loginName,
RemoteNumber AS PhoneNumber,
SUM(CallDurationSeconds) AS totalTalk
FROM CallDetail
WHERE LocalUserId = 'test' AND
I3TimeStampGMT BETWEEN '2013-01-01 08:00:00' AND '2013-04-30 07:00:00'
GROUP BY LocalUserId, RemoteNumber

なぜ今それが機能しているのですか?このクエリを PHP サーバーから実行するには何が必要ですか?

ありがとう

4

1 に答える 1

-2

上記のコメントの提案を使用して、それが許可の問題であることを発見しました。

リンク サーバーのプロパティに移動し、左側の [セキュリティ] メニューをクリックする必要がありました。次に、ユーザーとパスワードを追加する必要がありました。また、「ログインの現在のセキュリティ コンテキストを使用して作成する」も選択しました。

于 2013-04-30T19:29:13.757 に答える