TSQLt単体テストを含むSSDTプロジェクトがあります。
これを公開してすべてのテストを実行した後(デプロイ後のスクリプトから)、(localdbとSQL Server開発者エディションの両方に対して)問題があることにいつも気づきました。
パブリッシュは無期限に停止し、最終的にはビジュアルスタジオを終了する必要があります。
待機タイプはPREEMPTIVE_OS_AUTHORIZATIONOPS
で、これを待機しているステートメントの例(sys.dm_exec_sql_text
から)は次のとおりです。
(@r BIT OUTPUT)
SELECT @r = CASE
WHEN I.Version = I.ClrVersion THEN 1
ELSE 0
END
FROM tSQLt.Info() AS I;
私もこれを再現して
SELECT tSQLt.Private::Info()
これは簡単な方法です
public static SqlString Info()
{
return (SqlString) Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
ドメインコントローラーにアクセスして、何らかの権限またはその他の権限があることを確認しようとしていると思います。これは他のCLRアセンブリでは得られないので、これはTSQLTがSAFE_ACCESS
アセンブリではない(権限セットはEXTERNAL_ACCESS
である)と関係があるのではないかと疑っています。
ここで何が起こっているのか、そしてこれを修正し、これに遭遇することなく会社のネットワークから切断された状態で作業する方法を知っている人はいますか?
常にドメインに接続する予定がない場合は、それが開発インスタンスであるため、db所有者をドメインアカウントからローカルアカウントまたはSQLアカウントに変更します。
この素晴らしいブログをチェックしてください:
http://andreas-wolter.com/en/where-is-that-preemptive-wait-coming-from/
ブログ投稿を要約すると:
ed
多くのテストを行った後(詳細は関連する ディスカッション で確認できます)、ぶら下がりを発生させるために必要な要素を絞り込みましたが、最終的には何がぶら下がりの原因ではないのですか?自体。
私たちが今知っていること:
sqllang.dll!FVerifyAssemblyPermsForSids
_)を探しますSAFE
:に設定されている場合Info()
TVFへの最初の呼び出しは成功します。tSQLtCLR
アセンブリを_EXTERNAL_ACCESS
_としてマークしようとしますが、その場合(非対称キーにがないと仮定して)インストール済み):TRUSTWORTHY
がOFF
でない場合、Init
がTRUSTWORTHY
ではなく、非対称キーがないため、ON
プロシージャでの_tSQLt.EnableExternalAccess
_プロシージャの呼び出しは、「EXTERNAL_ACCESSまたはUNSAFE ...の許可なし」エラーで失敗します。それでも、OSから何も必要としないメタデータ操作であるため、ハングアップしません。これは_ISECManager::FIsAssemblyAuthorized
_の呼び出しである必要があります。これは、上記のFVerifyAssemblyPermsForSids
ステップの1つ前のステップです。TRUSTWORTHY
がON
の場合、Init
プロシージャでの_tSQLt.EnableExternalAccess
_プロシージャへの呼び出しは、次の理由でハングします。したがって、_ALTER Assembly tSQLtCLR WITH PERMISSION_SET = EXTERNAL_ACCESS;
_ステートメントでハングします。EXTERNAL_ACCESS
_に設定されている場合:TRUSTWORTHY
がOFF
の場合、Init
プロシージャでのInfo()
TVFの呼び出しは、権限がないため失敗します。これは、上記でTRUSTWORTHY
がOFF
であったときに見られた問題と同じです。エラーメッセージは異なりますが、これは、カスタムエラーメッセージがある_TRY...CATCH
_構文にクエリがあるためです(_tSQLt.EnableExternalAccess
_への呼び出しも_TRY...CATCH
_構文内にありますが、その呼び出しは、CATCH
ブロックのエラーメッセージを上書きしません。TRUSTWORTHY
がON
の場合、Init
プロシージャでのInfo()
TVFへの呼び出しは、OSに到達してドメインコントローラーからSIDアクセス許可情報を取得するときにハングします。理解するために残っているもの:
DBCC FREESYSTEMCACHE('ALL') WITH MARK_IN_USE_FOR_REMOVAL;
から解放している可能性があります。ただし、一貫性のある再現可能な期間はまだ見つかっていません。これまでのところ、約9分であるようです。TRUSTWORTHY OFF
_があった場合、これは発生しますか?これは、ハング状態が再び発生するまで待機してから_EXEC tSQLt.InstallExternalAccessKey
_を実行することでテストできます。次に、_TRUSTWORTHY OFF
_を設定して、再試行してください。TRUSTWORTHY ON
_に依存するよりも間違いなく優れているため、それに切り替えて_TRUSTWORTHY OFF
_を使用することをお勧めします。操作に非常に時間がかかる理由は、DCへの接続や情報(グループなど)の取得に問題があるようです。私の推測では、この情報を検索するために1つのインターフェース(インターネット)がどういうわけか選択されているという説明によると、ネットワーキングが一致しません。これは決して完了しません。