2012-05-08 9 views
10

Ho creato un sistema che utilizza i trigger CLR per connettersi al server WCF e notificarlo in merito alle modifiche nel DB. Funziona correttamente su SQL Server 2008 R2. Ora sto provando a migrare su SQL Server 2012. Per usare WCF ho bisogno di caricare l'assembly SMDiagnostics.dll insieme agli altri. Ive ha verificato che clr sia abilitato in db e che sia affidabile per essere "attivo", che abbia disabilitato il debug di WCF, che abbia controllato che il server SQL sia eseguito con l'account di sistema locale, quindi non ci sono problemi con le autorizzazioni. Ora il mio problema è che quando ho eseguito seguente comandoMSSQL 2012 creazione di trigger CLR per errore WCF

IF NOT EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'SMdiagnostics') 
create assembly [SMdiagnostics] 
from 'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication  Foundation\SMdiagnostics.dll' 
with permission_set = unsafe 
go 

ricevo seguente errore

Warning: The Microsoft .NET Framework assembly 'smdiagnostics, version=3.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.' 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. Msg 6586, Level 16, State 1, Line 2 Assembly 'SMdiagnostics' could not be installed because existing policy would keep it from being used.

SMdiagnostics.dll esiste nel percorso specificato. Come ho capito un qualche tipo di politica in SQL Server 2012 o in GAC, tuttavia non posso trovare alcuna politica su SMdiagnostics. Qualche idea su come risolverlo? Grazie.

+0

Le persone sui forum MSDN hanno sottolineato che sto cercando di caricare gli assembly da .net versione 3.0 in SQL Server 2012 che supporta framework 4.0 o superiore. Questo ha risolto alcuni dei problemi, ma ancora non posso caricare alcuni assembly che ho bisogno di usare WCF da trigger CLR. http://blogs.msdn.com/b/dohollan/archive/2012/04/20/sql-server-2012-sqlclr-net-framework-version.aspx – AlexS

risposta

12

Abbiamo presentato un problema con Microsoft un mese fa sullo stesso problema. La mia ipotesi è che non si riesce a caricare System.IdentityModel.dll che è una dipendenza dell'assembly System.ServiceModel. Microsoft ci ha indicato che mentre funzionava in SQL 2005 e SQL 2008 è un bug noto in SQL 2012 e non lo risolveranno fino a SQL 2014.

Il fatto che questo non sia diventato ancora ampiamente noto è un po 'una sorpresa per me, tranne che il 2012 è ancora molto nuovo. Ma questo significa che non è possibile utilizzare ciò che direi la migliore tecnologia di comunicazione tra le migliori pratiche di Microsoft all'interno di SQL CLR (WCF), si noti che il servizio di remotazione di .NET è disponibile anche perché utilizza anche l'assembly ServiceModel.

Sto sperando in un maggiore chiarimento su cosa direbbero che dovremmo usare invece, sto esaminando se esiste un modo per scrivere un CLR SQL basato su WSE, ma non sono molto entusiasta della prospettiva.

Sono abbastanza scontento di questo e spero che gli altri alzando la voce faranno notare che si tratta di un problema reale e che dovrebbe essere considerato inaccettabile.

+2

È accaduto qualcosa di simile a questo dal 2012? Sto ancora ricevendo l'errore ed è piuttosto il punto di inciampo – Oszkar

5

SQL 2012 passato alla versione di framework 4.0.30319. Pertanto, per impostazione predefinita non sarà possibile caricare gli assiemi dai framework precedenti.

Vedere MSDN thread per dettagli.

Sfortunatamente non è possibile caricare l'assembly System.ServiceModel dalla versione 4 del framework poiché dipende da Microsoft.VisualBasic.Activities.Compiler che non è un assembly .NET puro.

Script:

CREATE ASSEMBLY [System.ServiceModel] 
AUTHORIZATION [dbo] 
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.ServiceModel.dll' 
WITH PERMISSION_SET = UNSAFE; 

Ho sempre trovato il seguente errore:

Msg 6544, Level 16, State 1, Line 1 
CREATE ASSEMBLY for assembly 'Microsoft.VisualBasic.Activities.Compiler' failed because assembly 'Microsoft.VisualBasic.Activities.Compiler' is malformed or not a pure .NET assembly. 
Unverifiable PE Header/native stub. 
+0

SQL 2012 può caricare .Net 2.0, .Net 3.0 e .Net 3.5 assiemi bene. –

+1

Certo, ma AFAIK la politica di default vieta di caricare gli assembly più vecchi. Almeno questo è il caso della nostra installazione. Tuttavia ho ancora il problema con l'assemblaggio malformato o non puro. –

+3

@RemusRusanu Qualcuno può dirmi come caricare una versione precedente? Sto ottenendo: "Assembly 'X' non può essere installato perché la politica esistente gli impedirà di essere utilizzata." –

1

Il problema di non aver CREATE ASSEMBLY per System.IdentityModel.dll per il framework .NET versione 4.0 in SQL Server 2012 è stato risolto con un hotfix di sicurezza rilasciato di recente dal team .NET.

MS13-004: Descrizione dell'aggiornamento della protezione per.NET Framework 4 su Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7 e Windows Server 2008 R2: 8 Gennaio, 2013 http://support.microsoft.com/kb/2742595

mio test hanno dimostrato che non v'è alcun problema su Crea assieme con .NET 4.5 assemblaggio di System.IdentityModel.dll in SQL Server 2012.

Nathan Schoenack Supporto SQL tecnico Piombo

+0

Il mio server dice che il KB non può essere installato (ho provato tutti e 3 i gusti, per ogni evenienza). Come sei riuscito a importare i .Net 4.5 assiemi? Il mio SQL continua a dirmi "... __i stai registrando non è completamente testato nell'ambiente ospitato da SQL Server__ ...". –

6

Nathan Schoenack. Sì, http://support.microsoft.com/kb/2742595 risolvere il problema con System.IdentityModel.dll ma con System.Data.Services.dll ho ancora errore: CREATE ASSEMBLY per l'assembly 'System.Data.Services' non riuscito perché assembly 'microsoft.visualbasic.activities.compiler' è malformato o non è un assembly .NET puro. Intestazione PE non verificabile/stub nativo. Grazie.

Problemi correlati