O que o SQL 2005 faz com uma dll fornecida quando você registra uma montagem?

2

Herdamos um banco de dados legado do SQL 2005. Dois assemblies foram configurados para serem usados pelos gatilhos em um dos bancos de dados (ai). A pasta / arquivos foram excluídos por engano. Eles foram instalados por um funcionário anterior de sua pasta da área de trabalho e não foram verificados no controle de origem (double ouch). Agora que a dll sumiu, estamos preocupados com uma reinicialização. O SQL 2005 copia / renomeia / armazena essas DLLs de tal forma que significaria que uma reinicialização do servidor não criaria um problema?

    
por Roger Guess 26.01.2012 / 18:00

1 resposta

2

Você está com sorte, se os assemblies implantados originais estiverem simplesmente ausentes, você ainda poderá exportar o binário da montagem como uma cadeia hexadecimal.

1.Abra o SSMS e navegue até Programabilidade - > Assemblies. Você deveria ver sua Assembléia Registrada, eu destaquei a minha em vermelho.

2.Cliquenamontagemecrieumscriptparaumanovajaneladeconsulta:

3.Quando você fez isso, você verá algo assim:

CREATE ASSEMBLY [Microsoft.SqlServer.Types]
AUTHORIZATION [sys]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000...[snipped]
WITH PERMISSION_SET = UNSAFE

A linha com FROM 0x4D5A90000... é a montagem real codificada como uma cadeia hexadecimal grande. Veja abaixo como exportar de volta para o formato de arquivo.

Certifique-se de também script de funções, gatilhos, etc, que dependem deste assembly também. Você pode encontrá-los fazendo uma "View Dependencies" na montagem no SSMS.

Você deve ser capaz de reinicializar o servidor com impunidade porque o conjunto é armazenado e carregado de uma das tabelas de banco de dados do sistema (cujo nome não consigo lembrar da mão, mas a montagem é visível por meio do sys.assembly_files vista do sistema) e não no sistema de arquivos.

No entanto, se você não quiser dar um salto de confiança, faça a exportação como descrito acima e, em seguida, recrie em outra instância do SQL 2005 para ter certeza de que tudo está intacto.

Como exportar conjuntos registrados para arquivos

Com base em uma resposta que encontrei em este segmento você pode exportar seus assemblies registrados de volta para arquivos regulares. Se o Visual Studio foi usado para implantar o assembly, também pode haver alguns objetos de código-fonte armazenados no SQL Server, o que obviamente é um bônus. Por exemplo, quando consultei meu servidor de desenvolvimento após a implantação do VS2010, encontrei o seguinte:

SELECT * FROM sys.assembly_files

Como você pode ver, há alguns arquivos associados a SqlServerProject2 ( assembly_id = 65540 ). Podemos exportar todos eles executando este script:

DECLARE @assembly_id int, @name nvarchar(260), @content varbinary(MAX)
DECLARE @ObjectToken INT, @outputdir nvarchar(20)

-- Get assembly id from querying sys.assembly_files
SET @assembly_id = 65540                  -- IMPORTANT: SET THIS VALUE
SET @outputdir = 'D:\Data\Assemblies\'    --            AND THIS PATH

DECLARE assy_cursor CURSOR FOR
  SELECT name, content
  FROM sys.assembly_files 
  WHERE assembly_id = @assembly_id 

OPEN assy_cursor
FETCH NEXT FROM assy_cursor INTO @name, @content

WHILE @@FETCH_STATUS = 0
BEGIN

  SET @name = @outputdir + REPLACE(@name, '\', '-')
  print 'Saving: ' + @name  
  EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
  EXEC sp_OASetProperty @ObjectToken, 'Type', 1
  EXEC sp_OAMethod @ObjectToken, 'Open'
  EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @content
  EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @name, 2
  EXEC sp_OAMethod @ObjectToken, 'Close'
  EXEC sp_OADestroy @ObjectToken

  FETCH NEXT FROM assy_cursor INTO @name, @content
END
CLOSE assy_cursor
DEALLOCATE assy_cursor

Você precisará definir essas duas variáveis:

SET @assembly_id = 65540
SET @outputdir = 'D:\Data\Assemblies\'

O caminho @outputdir precisará estar em algum lugar em que o SQL Server tenha permissões para gravar.

Quando você executa o script, você deve acabar com um ou mais arquivos. Se você não tem todo o código fonte, então você pode sempre descompilar o assembly gerado usando o .NET Reflector.

Observação: a automação OLE (os procedimentos sp_OAxxxxx armazenados) está desabilitada por padrão no SQL Server, mas você pode ativá-la executando:

use master
go
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
    
por 26.01.2012 / 19:00