4

一部の SSIS スクリプト タスクで使用されている C# .NET 3.5 クラス ライブラリ (DLL) があるため、GAC にロードする必要があります。つまり、署名する必要があります。キーを作成して DLL に署名すると、SSIS で動作します。

次に、この DLL を SQL サーバーにロードし、この DLL 内のクラスのメソッドを参照するいくつかの CLR オブジェクトを作成します。VS2012 データベース プロジェクトがあり、DLL への参照を追加して、IsVisible および ModelAware プロパティを true に設定しました。UserDefinedFunctions クラスを拡張して、DLL 内の静的メソッドを呼び出す 2 つの関数を追加しました。

SAFEデータベース内のもの以外は何も必要ないため、データベース プロジェクト内の参照アセンブリと CLR オブジェクトの両方が に設定されています。

プロジェクトはビルドされますが、ローカル データベースに公開すると、次の奇妙なエラーで失敗します。

Creating [<<REFERENCED_DLL>>]...
Creating [<<CURRENT_DATABASE_CLR>>]...
(288,1): SQL72014: .Net SqlClient Data Provider: 
   Msg 6218, Level 16, State 2, Line 1 
   CREATE ASSEMBLY for assembly '<<CURRENT_DATABASE_CLR>>' failed
   because assembly '<<CURRENT_DATABASE_CLR>>' 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
[ : UserDefinedFunctions::sf_Function1][mdToken=0x6000001][offset 0x00000005]
   Unable to resolve token.
[ : UserDefinedFunctions::sf_Function2][mdToken=0x6000002][offset 0x00000005] 
   Unable to resolve token.

クレイジーなのは、<<REFERENCED_DLL>>アセンブリをビルドして署名しないと、プロジェクトが正常に発行され、機能が期待どおりに機能することです。データベース プロジェクトに署名しAllowPartiallyTrustedCallersて、参照されている DLL に追加しようとしました。

GAC と SQL サーバーの両方で使用できる、この DLL の 1 つのバージョンだけが必要です。これどうやってするの?

4

2 に答える 2

1

強力なキーをデータベースに登録しましたか?

  1. master データベースにマスター キーが存在しない場合は作成します。

    マスターを使用してください。

    パスワードによるマスターキー暗号化の作成 = 'your_password';

  2. 強力なキーのマスター データベースに非対称キーを作成します。.snk ファイルをデータベース サーバーにコピーする必要がありますが、一度登録するとサーバーから削除できます。

    CREATE ASYMMETRIC KEY sqlkey FROM FILE = 'path_to_the_strong_name_key';

  3. master データベースの非対称キーからログインを作成します。

    CREATE LOGIN yourlogin FROM ASYMMETRIC KEY yourkey;

  4. 作成したばかりのログインに UNSAFE ASSEMBLY 権限を付与します

    あなたのログインに安全でないアセンブリを許可します。

私は Visual Studio から直接発行することを好みますが、Visual Studio でも同じことができるはずです。

 CREATE ASSEMBLY yourSQLCLR
 FROM 'C:\\yourSignedSQLCLR.dll' 
 WITH PERMISSION_SET = UNSAFE | SAFE |  EXTERNAL_ACCESS
于 2016-07-16T14:57:08.730 に答える
1

セキュリティと安定性のために、SQLCLR は、承認された GAC アセンブリの小さなサブセットのみへのアクセスを制限しています。他のすべては、データベース内で明示的に登録する必要があります。

https://msdn.microsoft.com/en-us/library/ms403279(v=sql.105).aspxを参照して ください。

SQL Server CLR では、GAC から次のもののみを読み込むことができます。

CustomMarshalers
Microsoft.VisualBasic
Microsoft.VisualC
mscorlib
System
System.Configuration
System.Data
System.Data.OracleClient
System.Data.SqlXml
System.Deployment
System.Security
System.Transactions
System.Web.Services
System.Xml 
于 2016-07-15T12:15:19.580 に答える