Synchronizacja Dataverse i Synapse Data Lake vs. uwierzytelnienie SQL Server

O tym, że Microsoft postanowił zamordować usługę Dynamics 365 Export Service pozwalającą na jednokierunkową synchronizację danych między Dataverse i Azure SQL słyszeli już pewnie wszyscy czytelnicy bloga. Organizacje wykorzystujące omawianą usługę powinny (wg. ewangelistów z Redmond) przełączyć się i zacząć wykorzystywać natywną integrację swoich instancji Dataverse z usługą Azure Synapse. W tym miejscu pojawiają się jednak schody. Systemem docelowym w ww. integracji nie jest bowiem baza transakcyjna, lecz usługa typu Data Lake. Natomiast dane pochodzące z Dataverse składowane są tam w postaci plików.

Powyższą sytuację ratuję dostępna w ramach Azure Synapse serverlessowa pula SQL[1]. W praktyce możemy więc dostać się do danych plikowych nawet za pomocą kodu wykorzystującego klasyczne ADO.NET:

using (SqlConnection conn = new SqlConnection(ConnectionString)) // ConnectionString to Synapse Data Lake Workspace
{
    conn.Open();
    Console.WriteLine("Connection succesfull"); 

    var command = conn.CreateCommand();
    command.CommandText = "SELECT Id, Name FROM account"; 

    var dataReader = command.ExecuteReader();
    while (dataReader.Read())
    {
        Console.WriteLine($"{ dataReader.GetValue(0).ToString() } : { dataReader.GetValue(1) }");
    }

    Console.WriteLine("Read operation completed");
}

Powyższy mechanizm działa bez konieczności wykonywania jakichkolwiek czynności konfiguracyjnych. Na kłopot napotkałem w momencie, w którym zamiast zintegrowanego uwierzytelniania Azure Active Directory chciałem skorzystać z uwierzytelniania bazodanowego SQL Server wewnątrz procesów starego dobrego SQL Server Integration Services. 

Repozytorium danych uraczyło mnie wówczas następującym błędem:

Cannot find the CREDENTIAL '<sqladminuser>’, because it does not exist, or you do not have permission.

Wprowadzona nazwa użytkownika oraz hasło na pewno były prawidłowe. „Ki diabeł?” – pomyślałem. Na szczęście z pomocą przyszła natychmiast internetowa społeczność i dzięki niej udało mi się rozwiązać napotkany problem.

W jaki sposób to zrobić?

Otóż w Azure Storage Account należy utworzyć nową sygnaturę współdzielonego dostępu (Shared Access Signature, więcej nt. tego mechanizmu znajdziecie pod adresem: https://docs.microsoft.com/en-us/rest/api/storageservices/delegate-access-with-shared-access-signature).

Następnie z poziomu edytora języka U-SQL w aplikacji Synapse Studio należy uruchomić poniższy skrypt:

CREATE CREDENTIAL [https://mystorageaccount.dfs.core.windows.net/dataversefiles/**/*.csv]
WITH IDENTITY='SHARED ACCESS SIGNATURE'
, SECRET = 'mysecret';
GO

Gdzie:

  • mystorageaccount – nazwa naszego konta Azure Storage
  • dataversefiles – nazwa folderu, w którym przechowywane są pliki zawierające dane z Dataverse
  • mysecret – klucz SAS wygenerowany w poprzednim kroku

Po tej operacji uwierzytelnienie SQL Server powinno zadziałać prawidłowo.  

To wszystko na dziś. Sayonara!


[1] Wybaczcie mi powyższe kalki z języka mieszkańców Brytanii.

Total Views: 170 ,