web-dev-qa-db-ja.com

SQL ServerはSSMSでIntelliSenseを無効にできますか?

SSMS 2016(バージョン:13.0.15000.23)を使用していて、SQL Serverデータベース2016(バージョン:13.0.5081.1)に接続しています。

IntelliSenseが私のSSMSで動作していません。

私は以下を試しました:

  • ツール>>オプション>>テキストエディター>> Transact-SQL >> IntelliSense、[IntelliSenseを有効にする]を選択
  • ツール>>オプション>>テキストエディター>> Transact-SQL >>一般、および自動リストメンバーとパラメーター情報のチェックボックスがオンになっていることを確認します
  • クエリ>> IntelliSense有効
  • SQLCMDが無効になっていることを確認する
  • IntelliSenseキャッシュの更新(Ctrl + Shift + R)
  • クエリにコンパイルエラーがないことを確認する
  • SSMSをアンインストールして再インストールする

チームの他のメンバーに尋ねたところ、IntelliSenseは散発的にしか機能しません。

質問:
SSMSでIntelliSenseを無効にするサーバー設定はありますか?


私はすでにこれらすべての質問を終えました:

インスタンスに対する権限は制限されていますが、作業中のデータベースのレコードを選択して更新できます(挿入はしませんでした)。次のコマンドを実行すると、約1,600のオブジェクトと列の名前を確認できます。

SELECT o.name, c.name 
FROM sys.objects o 
    INNER JOIN sys.columns c ON o.object_id = c.object_id 
WHERE o.is_ms_shipped = 0;
4
Farhan

許可

これまでに受け取ったコメントの回答が示唆するように、この問題の最も可能性の高い理由は、そのデータベースへの適切な権限がないことです。これは(漠然と)ここに文書化されています:

IntelliSenseのトラブルシューティング->データベースエンジンクエリIntelliSense

  • 完了リストには、権限のないデータベースオブジェクトは含まれません。 IntelliSenseは、ユーザーがアクセス許可を持っているオブジェクトへの参照にフラグを立てます。たとえば、他のユーザーが作成したスクリプトを開いた場合、そのユーザーがアクセス許可を持っているオブジェクトへの参照はあり、ユーザーには正しくないというフラグが立てられていません。

これを修正する最も簡単な方法は、DBAに、このデータベースへの接続に使用しているデータベースユーザーに「定義の表示」権限を付与させることです。

たとえば、ローカルSQL Server 2016インスタンスで、このログインと特定のデータベースのデータベースユーザーを作成できます。

USE [master]
GO
CREATE LOGIN [nerd-login] WITH PASSWORD = 'NerdPassword1';


USE [SomeDatabase]
GO
CREATE USER [nerd-user] FOR LOGIN [nerd-login] WITH DEFAULT_SCHEMA=[dbo]
GO

そして、nerd-loginとしてログインした場合、SomeDatabaseデータベースに接続できますが、インテリセンスを取得できません。しかし、このコマンドを実行した後:

USE [SomeDatabase]
GO
GRANT VIEW DEFINITION TO [nerd-user];

SomeDatabaseデータベースのオブジェクトのインテリセンスを取得できます。

これは、インスタンスレベルでより広範囲に付与することもできます(GRANT VIEW ANY DEFINITIONmasterデータベースコンテキスト)、またはオブジェクトごとのレベル。

待ち時間

ここのコメントで、あなたは言及しました:

サーバーは約50マイル離れていますが、新しいブラウザーを開くのに数秒かかるため、ネットワーク/コンピューターに問題があると思います。

特定のデータベースのメタデータの量(テーブル、ビュー、列、関数、ストアドプロシージャなど)、ユーザーとデータベース間のネットワーク速度、他のデータベースのビジー度などの要因はすべて、IntelliSenseに影響を与える可能性があります。

Aaron Bertrandのブログ投稿で、レイテンシの問題をかなり徹底的に扱います。

SQL Server Management Studio 2012でのIntelliSenseのトラブルシューティング

そして最後に、あなたはただ我慢する必要があるかもしれません。ネットワーク速度、サーバーの全体的な状態を確認し、メタデータが非常に大きいかどうかを理解します。たとえば、SAPを実行している場合、AdventureWorksよりも多くのデータを収集する必要があります。

SSMSが宛先サーバーからメタデータを取得しようとすると、結果の受信を開始する前にタイムアウトになる場合があります。このタイムアウトは、SSMS 2012では2秒にハードコードされていますが、以前のバージョンでは、データベース接続がタイムアウトするまで待機していました(30秒以上になる可能性がありました)。バックグラウンドで引き続き試行されるため、ドロップダウンがすぐに表示されない場合がありますが、Ctrl + Jを連続して押した後に表示される場合があります。

Ctrl + Shift + Rまたはメニューオプションの[編集]> [IntelliSense]> [ローカルキャッシュを更新]を押すと、強制的に再読み込みを試行できます。メタデータがバックグラウンドで取得されると、データはローカルメモリにキャッシュされます。接続が機能していて、上記の要素のいずれも機能していない場合、最終的にはキャッシュが読み込まれ、すべての機能を使用できるようになります。

ただし、SSMS 2008またはSSMS 2008 R2では、タイムアウトが緩和されているため、これには少し時間がかかる場合があります。

注:それはSSMS 2012に関するものだと思いますが、同じ一般原則が引き続き適用されます

10
Josh Darnell