web-dev-qa-db-ja.com

「System.DirectoryServices」が検証に失敗したため、SSDT Publishが失敗する

既存のデータベース(SQL2012)をVS2017のSSDTプロジェクトにインポートし、それをローカルインスタンス(SQL2016)にデプロイしようとすると、次のエラーメッセージが表示されます。

アセンブリ 'System.DirectoryServices'の検証に失敗したため、アセンブリ 'System.DirectoryServices'のアセンブリの作成に失敗しました。

SSMSのデータベースにアセンブリを作成しても、次のように指定しても問題はありません。

C:\ Windows\Microsoft.NET\Assembly\GAC_MSIL\System.DirectoryServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.DirectoryServices.dll

SSDTプロジェクトでは、SQLCLRでターゲットフレームワークを.NET Framework 4に設定しています。

System.DirectoryServicesへの参照では、Generate Sql ScriptおよびModel Awareオプションがtrueに設定され、権限がUnsafeに設定されています。

データベース設定でも、信頼できるオプションが有効になっています。

ランニング select * from sys.dm_clr_propertiesインスタンスで次を返します:

directory   C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
version v4.0.30319 
state   CLR is initialized

プロジェクトを正常に公開するには、何を変更する必要がありますか?

以下の完全なエラーメッセージ。

Creating [System.DirectoryServices]...
Warning: The Microsoft .NET Framework Assembly 'system.directoryservices, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.' you are registering is not fully tested in the SQL Server hosted environment and is not supported. In the future, if you upgrade or service this Assembly or the .NET Framework, your CLR integration routine may stop working. Please refer SQL Server Books Online for more details.
(221,1): SQL72014: .Net SqlClient Data Provider: Msg 6218, Level 16, State 2, Line 1 CREATE Assembly for Assembly 'System.DirectoryServices' failed because Assembly 'System.DirectoryServices' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message
[ : System.DirectoryServices.ActiveDirectorySecurity::PurgeAccessRules][mdToken=0x6000009][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::PurgeAuditRules][mdToken=0x6000010][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::get_AccessRightType][mdToken=0x6000015][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::get_AccessRuleType][mdToken=0x6000016][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::get_AuditRuleType][mdToken=0x6000017][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::ModifyAccessRule][mdToken=0x6000008][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::ModifyAuditRule][mdToken=0x600000f][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::AccessRuleFactory][mdToken=0x6000011][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::AuditRuleFactory][mdToken=0x6000013][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::AccessRuleFactory][mdToken=0x6000012][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::AuditRuleFactory][mdToken=0x6000014][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::.ctor][mdToken=0x6000001][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurity::AddAccessRule][mdToken=0x6000002][offset 0x00000000] Code size is zero.
[ : System.DirectoryServices.ActiveDirectorySecurit...
(221,0): SQL72045: Script execution error.  The executed script:
CREATE Assembly [System.DirectoryServices]
    AUTHORIZATION [dbo]
    FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300A1E3A14B0000000000000000E00022200B01080000E801000008000000000000C205020000200000002002000000AC65002000000002000004000000000000000400000000000000006002000002000062580200030040850000100000100000000010000010000000000000100000000000000000000000700502004F000000002002006C040000000000000000000000F2010070170000004002000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000038E601000020000000E8010000020000000000000000000000000000200000602E727372630000006C040000002002000006000000EA0100000000000000000000000000400000402E72656C6F6300000C00000000400200
An error occurred while the batch was being executed.
2
mheptinstall

この動作がSSDTによるものか、以前のバージョンからの変更によるものかはわかりませんが、「参照アセンブリ」が取り込まれていることが原因です。参照アセンブリは実際のアセンブリではないため、機能しません。 SQL Serverにインポートします。ここでイライラするのは、参照を追加するときに「参照」を使用してC:\ WINDOWS\Microsoft.NET\Framework64\v4.0.30319\System.DirectoryServices.dllを選択し、次に「 trueの場合、Model Awareそのプロパティの下で、SSDTは、参照したDLL(413 kb))ではなく、参照アセンブリ(114 kb)を引き続きプルします。より具体的には、プロジェクトプロパティで設定された「ターゲットフレームワークバージョン」に対応するフォルダーからの参照アセンブリ(例4.6.1 == C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework\.NETFramework\v4 .6.1)。問題がある場合は、Visual Studio 2015とSSDT for Management Studio 2017(つまりv14)を使用しています。

ただし、理想的ではありませんが、DLLを非システムフォルダーにコピーして、これを機能させることができました。完全なSystem.DirectoryServices.dllをコピーしました)== C:\ WINDOWS\Microsoft.NET\Framework64\v4.0.30319 \をプロジェクトフォルダーに追加し、DLLを指すように「既存のアイテム」を追加しました=(私のプロジェクトフォルダー内)、これにはNoneの「ビルドアクション」があり、次に参照プロパティを次のように設定します。所有者= dbo、権限セット= UNSAFE、そして、Model Aware = True。その後、機能しました。

このDLLに依存関係がある場合、プロジェクトにもコピーする必要があると思いますが、その部分については100%確信がありません。

この経験を、サポートされていない.NET FrameworkライブラリーやSSDTを使用しない理由のリストに追加できると思います;-)

2
Solomon Rutzky