Entwicklung für Microsoft SQL Server: Unix Weg

Hallo habr

Mittelgroße und große Projekte, bei denen die gesamte oder ein wesentlicher Teil der Geschäftslogik in den gespeicherten Prozeduren des DBMS implementiert ist, haben eine Reihe von Unannehmlichkeiten bei der Verwaltung des Codes der Module. Nämlich:
  • Fehlende Versionskontrolle und Nachverfolgung von Codeänderungen;
  • Schwierigkeiten bei der Synchronisation von Test- und Produktionsinfrastruktur;
  • Mangel an Such-, Navigations- und Codeüberprüfungsmitteln.

Ja, es gibt kommerzielle Produkte, die diese Probleme ganz oder teilweise lösen. Nach Meinung des Autors tun sie dies jedoch weder effizient noch elegant. In Anbetracht dessen wird die Zuordnung von Datenbankmodulen und Struktur zum Dateisystem mithilfe von FUSE (Filesystem in Userspace) im SQLFuse- Projekt implementiert . Jetzt können Unix-Way- Follower hier durchkommen.

Betrachten Sie die Abfolge der Aktionen zum Mounten einer experimentellen Datenbank.

Montagevorbereitung


Zum Erstellen und Mounten benötigen Sie die folgende Software:
  • Linux-Kernel- FUSE- Modul ;
  • FreeTDS- Treiber ;
  • Notwendige Software für die Montage. Es wird normalerweise in populären Linux - Distributionen als base - devel bezeichnet , einschließlich des gcc - Compilers , des make - Tools usw .;
  • GNU Bison und Flex.

Stellen Sie sicher, dass das FUSE- Kernelmodul geladen ist:
modprobe -a fuse

Nach der Installation der Software müssen Sie das Git-Repository klonen:
git clone https://github.com/AlexandrMov/SQLFuse.git

Die Assemblierung des Projekts erfolgt mit den Befehlen:
make clean
make


Anpassung


Wenn das Kompilieren und Assemblieren erfolgreich war, müssen Sie die Konfigurationsdatei sqlfuse.conf konfigurieren , die sich im Verzeichnis conf des geklonten Repositorys befindet:
  # глобальная группа параметров, применяются ко всем профилям
  [global]
  # количество сеансов
  maxconn=1
  # наименование приложения, передаваемое при подключении к SQL Server
  appname=SQLFuse
  # пользовательский профиль подключения
  [AdventureWorks2008R2]
  # имя или адрес хоста/экземпляра SQL Server
  servername=192.168.6.50
  # база данных
  dbname=AdventureWorks2008R2
  # профиль авторизации, определённый в sqlfuse.auth.conf
  auth=advauth

Der auth- Parameter bezieht sich auf den Gruppennamen, der in der Datei sqlfuse.auth.conf definiert ist :
  # пользовательский профиль авторизации
  [advauth]
  # логин пользователя
  username=fuse
  # пароль пользователя
  password=123

Anstelle des auth- Parameters in der Datei sqlfuse.auth.conf ist die Definition von Benutzername und Kennwort in der Datei sqlfuse.conf zulässig . Dies wurde nicht absichtlich gemacht, da der Autor beim Bearbeiten von Verbindungsprofilen paranoid ist und jemand das Kennwort des Benutzers ausspionieren kann.
Wenn Sie eine Serverinstanz angeben, zum Beispiel die SQLServer \ SQLEXPRESS , das Symbol „\“ kann nicht entgangen sein. Dies gilt auch für den Parameter Benutzername , wenn Sie sich über Active Directory anmelden müssen.

Vergessen Sie nicht, dass die AdwentureWorks2008R2- Datenbank verbunden sein muss und der ausgewählte Benutzer über alle erforderlichen Rechte zum Ändern von SQL Server-Modulen verfügt.

Bekannte Probleme


Wenn Sie Probleme mit Codierungen haben, versuchen Sie, die Parameter to_codeset und from_codeset zu verwenden, die die Konvertierungsrichtung angeben:
from_codeset=UTF-8
to_codeset=CP1251

Wenn dieser Fehler auftritt:
Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.
Verwendung Einstellung ansi_npw = true für die obligatorische Einbeziehung von Optionen QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_WARNINGS, ANSI_PADDINGS zu erklären , die ON :

Montage


Erstellen Sie den advworks- Ordner im Stammverzeichnis des geklonten SQLFuse- Repositorys und hängen Sie unsere Datenbank darin ein:
mkdir advworks
./sqlfuse -o profilename=AdventureWorks2008R2 ./advworks

Mit der Option -d können Sie von SQL Server generierte Fehler überwachen:
./sqlfuse -d -o profilename=AdventureWorks2008R2 ./advworks &> ./advworks.log &


Grundlegende Aktionen für Module


Lassen Sie mich ein Beispiel für einige einfache Aktionen an Serverobjekten geben.
  • Anzeigen und Navigieren in der Datenbankstruktur in MidnightCommander :



  • Erstellen Sie ein neues Feld in der Person.Person- Tabelle und löschen Sie es:
    echo "COLUMN TestColumn NVARCHAR(50) NOT NULL" > ./Person/Person/TestColumn
    rm ./Person/Person/TestColumn
    

  • Kopieren einer Prozedur aus dem HumanResources- Schema in das Dbo-Schema :
    cp ./HumanResources/uspUpdateEmployeeLogin ./dbo/uspUpdateEmployeeLogin

  • Suchverfahren nach Namen in allen Schemata:
    find ./ -maxdepth 2 -iname *Employee* -type f -print

So wird das Verwalten und Navigieren von Modulen zu einem gewöhnlichen Verzeichnis mit Dateien: Versionskontrollsysteme, Patches und bevorzugte Code-Editoren sind möglich, dh die gesamte Unix-Philosophie ist auch für SQL Server verfügbar.
Beachten Sie, dass die Funktion zum Abschneiden noch nicht unterstützt wird. Dies bedeutet, dass der Befehl ausgeführt wird
echo " NOT NULL" >> TestColumn
wird nicht funktionieren. Es ist zwar auf Dateisystemebene blockiert, der Vorgang hat es aber trotzdem nicht empfohlen, da es zu einer Neuerstellung der Spalte und zu Datenverlust kommen kann!

Bewahren Sie immer die Originale der Module auf, bevor Sie sie bearbeiten!

Wenn Sie in der Modulbeschreibung einen Fehler gemacht haben oder eine Verbindung unterbrochen wurde , gibt das Dateisystem den Fehler -EFAULT (" Ungültige Adresse") aus.

Unterstützte Module


Zum Zeitpunkt der Erstellung des Posts hat SQLFuse die folgenden Module zum Lesen / Schreiben unterstützt :
  • Gespeicherte Prozeduren, Funktionen;
  • Einschränkungen CHECK, DEFAULT;
  • Spalten und Trigger.

Lesen nur verfügbar Schemata, Tabellen, Views . Die Einschränkungen von FOREIGN KEY, PRIMARY KEY und Indizes werden überhaupt nicht angezeigt . Wenn es mehr Freizeit gibt, werde ich diese Funktionalität hinzufügen.

Ich musste die T-SQL-Syntax etwas vereinfachen, um Verwirrung und flexiblere Modulverwaltung zu vermeiden. Alles blieb gleich, außer dass bei der Definition von Einschränkungen und Spalten die Redundanz in der Tabellenbeschreibung beseitigt wurde. Die Definitionen sehen folgendermaßen aus:
  • Spalten:
    /*ALTER TABLE Person.Person ADD/ALTER/DROP*/ COLUMN TestColumn DATETIME -- ...
  • CHECK-Einschränkung:
    /*ALTER TABLE Person.Person ADD/DROP*/ WITH CHECK CONSTRAINT CK_Test CHECK -- ...
  • DEFAULT-Einschränkung:
    /*ALTER TABLE Person.Person ADD/DROP*/ DEFAULT (GETDATE()) FOR (TestColumn) -- ...

In den Teilen, in denen die Anweisungen zur Zieltabelle auskommentiert sind, ersetzt SQLFuse den erforderlichen Code automatisch anhand des Speicherorts der Moduldatei. Der Name des Moduls, der im Text der Datei definiert ist, spielt keine Rolle, er wird bei Bedarf durch den Namen der Datei, des Schemas und / oder der Tabelle ersetzt. In den Texten von Modulen können nicht mehrere Befehlspakete vorhanden sein, d.h. GO

Nachwort oder wie geht es weiter?


Nach Erhalt der Freizeit planen die umzusetzen:
  • Unterstützung für Einschränkungen und Indizes sowie die Bearbeitung von Tabellen, Ansichten und Diagrammen;
  • SQL-Befehle protokollieren und über eine Pipe oder nur eine Datei ausgeben;
  • Sichern von Sicherungskopien während der Modulmanipulation, Unterstützung des Rollbacks bei Fehlern;
  • Im nächsten Beitrag wird die Bildung von Tabellendefinitionen und die Umwandlung der Struktur in SQL-Skripte beschrieben.

Wenn Sie an der Idee interessiert sind und sich an der Entwicklung beteiligen möchten, sind Sie herzlich willkommen: Der gesamte Quellcode steht unter der GPLv3-Lizenz zur Verfügung. Der Autor freut sich über Kommentare und Vorschläge.

PS: Ich kann Ihnen über die Erfahrungen bei der Entwicklung eines Dateisystems im Benutzermodus auf FUSE berichten, wenn sich jemand dafür interessiert.

Datenquellen



Jetzt auch beliebt: