O logon que executa todos esses comandos é um membro da sysadmin
função de servidor em uma instância do SQL 2012 Developer. É o proprietário do banco de dados em que isso está sendo implantado. EXTERNAL ACCESS ASSEMBLY
permissão foi concedida ao login neste banco de dados. Também tentei tudo abaixo como o sa
login sem sucesso.
alter database test set trustworthy on
go
create assembly [icsharpcode.sharpziplib]
from 'C:\Workspace\111\icsharpcode-SharpZipLib-4f2d664\bin\Release\ICSharpCode.SharpZipLib.dll'
with permission_set = UNSAFE --< This works!
go
create assembly OutOfRowCompression
from 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
with permission_set = UNSAFE --< This fails!
go
O último comando falha com:
Msg 10327, nível 14, estado 1, linha 1 CREATE ASSEMBLY para assembly 'OutOfRowCompression' falhou porque assembly 'OutOfRowCompression' não está autorizado para PERMISSION_SET = UNSAFE. O assembly é autorizado quando uma das seguintes condições for verdadeira: o proprietário do banco de dados (DBO) tem a permissão UNSAFE ASSEMBLY e o banco de dados tem a propriedade de banco de dados TRUSTWORTHY ativada; ou o assembly é assinado com um certificado ou uma chave assimétrica que possui um logon correspondente com permissão UNSAFE ASSEMBLY.
Depois de obter o erro, assinei o assembly com uma nova chave assimétrica key1.pfx
e a adicionei ao banco de dados mestre:
CREATE ASYMMETRIC KEY key1
FROM executable
FILE = 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
Verificado se a chave existe:
Criou um login a partir desta chave e concedeu o modo Deus:
create login clr_key1 from asymmetric key key1
go
GRANT EXTERNAL ACCESS ASSEMBLY TO clr_key1
go
Ainda o mesmo erro do comando de criação de montagem.
Tentei construir o assembly OutOfRowCompression
com acesso SAFE e UNSAFE no Visual Studio 2012 - nenhuma diferença.
Sinto que satisfiz todos os requisitos apresentados pela mensagem de erro. Deve funcionar. o que estou perdendo?
Sua
GRANT
afirmação está incorreta. Você concedeu apenas a capacidade de definir Assemblies paraEXTERNAL_ACCESS
, não paraUNSAFE
.UNSAFE
é menos restrito queEXTERNAL_ACCESS
e, portanto, concederUNSAFE ASSEMBLY
a um Login inclui – implicitamente – aEXTERNAL ACCESS ASSEMBLY
permissão.Você precisa usar:
PS Você precisa verificar as duas DLLs que está importando para saber por que elas precisam ser marcadas como
UNSAFE
. Se for devido ao armazenamento de valores em variáveis estáticas, isso poderá resultar em resultados inesperados se duas sessões executarem esse código ao mesmo tempo.