it-swarm.com.de

Verwenden Sie die Quellcodeverwaltung für Ihre Datenbankelemente?

Meines Erachtens hat mein Shop eine Lücke, da wir keinen soliden Prozess für die Versionierung unserer Datenbankschemaänderungen haben. Wir machen viele Backups, damit wir mehr oder weniger geschützt sind, aber es ist eine schlechte Praxis, sich auf diese Weise auf Ihre letzte Verteidigungslinie zu verlassen.

Überraschenderweise scheint dies ein roter Faden zu sein. Viele Geschäfte, von denen ich gesprochen habe, ignorieren dieses Problem, weil sich ihre Datenbanken nicht oft ändern und sie im Grunde nur versuchen, akribisch zu sein.

Ich weiß jedoch, wie diese Geschichte läuft. Es ist nur eine Frage der Zeit, bis alles schief läuft und etwas verloren geht.

Gibt es hierfür Best Practices? Welche Strategien haben für Sie funktioniert?

589
Brian MacKay

Muss lesen Holen Sie sich Ihre Datenbank unter Versionskontrolle . Überprüfen Sie die Reihe der Beiträge von K. Scott Allen.

Bei der Versionskontrolle ist die Datenbank häufig ein Bürger zweiter oder sogar dritter Klasse. Wie ich gesehen habe, können Teams, die in einer Million Jahren niemals daran denken würden, Code ohne Versionskontrolle zu schreiben - und das zu Recht - die Notwendigkeit einer Versionskontrolle für die kritischen Datenbanken, auf die sich ihre Anwendungen stützen, völlig vergessen. Ich weiß nicht, wie Sie sich als Softwareentwickler bezeichnen und ein klares Gesicht bewahren können, wenn Ihre Datenbank nicht genau der gleichen strengen Quellcodeverwaltung unterliegt wie der Rest Ihres Codes. Lass dir das nicht passieren. Stellen Sie Ihre Datenbank unter Versionskontrolle.

382
Gulzar Nazim

Die Datenbanken selbst? Nein

Die Skripte, die sie erstellen, einschließlich statischer Dateneinfügungen, gespeicherter Prozeduren und dergleichen; Na sicher. Es handelt sich um Textdateien, die im Projekt enthalten sind und wie alles andere ein- und ausgecheckt werden.

In einer idealen Welt würde Ihr Datenbankverwaltungstool dies natürlich tun. aber man muss einfach diszipliniert sein.

133
blowdart

Ich liebe Rails ActiveRecord-Migrationen. Es abstrahiert die DML zu Ruby Skript, das dann einfach in Ihrem Quell-Repository versioniert werden kann.

Mit ein bisschen Arbeit könnten Sie jedoch das Gleiche tun. Alle DDL-Änderungen (ALTER TABLE usw.) können in Textdateien gespeichert werden. Behalten Sie ein Nummerierungssystem (oder einen Datumsstempel) für die Dateinamen bei und wenden Sie sie nacheinander an.

Rails verfügt außerdem über eine Versionstabelle in der Datenbank, die die zuletzt angewendete Migration protokolliert. Sie können das gleiche leicht tun.

36
Matt Rogish

Lesen Sie LiquiBase , um Datenbankänderungen mithilfe der Quellcodeverwaltung zu verwalten.

33
killdash10

Sie sollten sich niemals nur anmelden und "ALTER TABLE" -Befehle eingeben, um eine Produktionsdatenbank zu ändern. Das Projekt, an dem ich arbeite, verfügt über eine Datenbank an jedem Kundenstandort. Daher wird jede Änderung an der Datenbank an zwei Stellen vorgenommen: an einer Speicherauszugsdatei, mit der eine neue Datenbank an einem neuen Kundenstandort erstellt wird, und an einer Aktualisierungsdatei, die ausgeführt wird bei jedem Update, bei dem Ihre aktuelle Datenbankversionsnummer mit der höchsten Nummer in der Datei verglichen und Ihre Datenbank aktualisiert wird. So zum Beispiel die letzten paar Updates:

if [ $VERSION \< '8.0.108' ] ; then
  psql -U cosuser $dbName << EOF8.0.108
    BEGIN TRANSACTION;
    --
    -- Remove foreign key that shouldn't have been there.
    -- PCR:35665
    --
    ALTER TABLE     migratorjobitems
    DROP CONSTRAINT migratorjobitems_destcmaid_fkey;
    -- 
    -- Increment the version
    UPDATE          sys_info
    SET             value = '8.0.108'
    WHERE           key = 'DB VERSION';
    END TRANSACTION;
EOF8.0.108
fi

if [ $VERSION \< '8.0.109' ] ; then
  psql -U cosuser $dbName << EOF8.0.109
    BEGIN TRANSACTION;
    --
    -- I missed a couple of cases when I changed the legacy playlist
    -- from reporting showplaylistidnum to playlistidnum
    --
    ALTER TABLE     featureidrequestkdcs
    DROP CONSTRAINT featureidrequestkdcs_cosfeatureid_fkey;
    ALTER TABLE     featureidrequestkdcs
    ADD CONSTRAINT  featureidrequestkdcs_cosfeatureid_fkey
    FOREIGN KEY     (cosfeatureid)
    REFERENCES      playlist(playlistidnum)
    ON DELETE       CASCADE;
    --
    ALTER TABLE     ticket_system_ids
    DROP CONSTRAINT ticket_system_ids_showplaylistidnum_fkey;
    ALTER TABLE     ticket_system_ids
    RENAME          showplaylistidnum
    TO              playlistidnum;
    ALTER TABLE     ticket_system_ids
    ADD CONSTRAINT  ticket_system_ids_playlistidnum_fkey
    FOREIGN KEY     (playlistidnum)
    REFERENCES      playlist(playlistidnum)
    ON DELETE       CASCADE;
    -- 
    -- Increment the version
    UPDATE          sys_info
    SET             value = '8.0.109'
    WHERE           key = 'DB VERSION';
    END TRANSACTION;
EOF8.0.109
fi

Ich bin mir sicher, dass es einen besseren Weg gibt, aber es hat bisher für mich funktioniert.

29
Paul Tomblin

Ja. Code ist Code. Meine Faustregel lautet: Ich muss in der Lage sein, die Anwendung von Grund auf neu zu erstellen und bereitzustellen, ohne einen Blick auf eine Entwicklungs- oder Produktionsmaschine zu werfen.

18
Stu Thompson

Die beste Vorgehensweise, die ich gesehen habe, ist das Erstellen eines Erstellungsskripts zum Verschrotten und Neuerstellen Ihrer Datenbank auf einem Staging-Server. Jede Iteration erhielt einen Ordner für Datenbankänderungen, alle Änderungen wurden mit "Drop ... Create" skriptiert. Auf diese Weise können Sie jederzeit ein Rollback auf eine frühere Version durchführen, indem Sie den Build auf den Ordner verweisen, in den Sie die Version erstellen möchten.

Ich glaube, das wurde mit NaNt/CruiseControl gemacht.

14
Sara Chipps

JA, ich halte es für wichtig, Ihre Datenbank zu versionieren. Nicht die Daten, sondern das Schema.

In Ruby on Rails wird dies durch das Framework mit "Migrationen" erledigt. Jedes Mal, wenn Sie die Datenbank ändern, erstellen Sie ein Skript, das die Änderungen anwendet und in die Quellcodeverwaltung eincheckt.

Meinem Shop hat diese Idee so gut gefallen, dass wir die Funktionalität zu unserem Java-basierten Build hinzugefügt haben mithilfe von Shell-Skripten und Ant. Wir haben den Prozess in unsere Bereitstellungsroutine integriert. Es wäre ziemlich einfach, Skripte zu schreiben, um dasselbe in anderen Frameworks zu tun, die die sofortige DB-Versionierung nicht unterstützen.

11
Pete

Die neuen Datenbankprojekte in Visual Studio bieten Versionskontrolle und Änderungsskripten.

Sie verfügen über ein Nizza-Tool zum Vergleichen von Datenbanken und können ein Skript generieren, das das Schema des einen in das andere konvertiert oder die Daten in einem entsprechend aktualisiert.

Das DB-Schema wird "geschreddert", um viele, viele kleine .sql-Dateien zu erstellen, eine pro DDL-Befehl, der die DB beschreibt.

+ tom


Zusätzliche Informationen 2008-11-30

Ich benutze es seit einem Jahr als Entwickler und mag es wirklich. Es macht es einfach, meine Entwicklungsarbeit mit der Produktion zu vergleichen und ein Skript zu generieren, das für die Veröffentlichung verwendet wird. Ich weiß nicht, ob Funktionen fehlen, die DBAs für Projekte vom Typ "Unternehmen" benötigen.

Da das Schema in SQL-Dateien "zerlegt" ist, funktioniert die Quellcodeverwaltung einwandfrei.

Ein Punkt ist, dass Sie eine andere Denkweise haben müssen, wenn Sie ein DB-Projekt verwenden. Das Tool verfügt in VS über ein "Datenbankprojekt", bei dem es sich nur um die SQL-Datei handelt, sowie eine automatisch generierte lokale Datenbank, die das Schema und einige andere Verwaltungsdaten enthält, jedoch keine Ihrer Anwendungsdaten sowie Ihre lokale Entwicklerdatenbank, für die Sie sie verwenden App Daten Entwickler arbeiten. Sie sind sich der automatisch generierten Datenbank selten bewusst, aber Sie müssen sie dort kennen, damit Sie sie in Ruhe lassen können :). Diese spezielle Datenbank ist klar erkennbar, da sie eine Guid im Namen hat.

Das VS DB-Projekt übernimmt die Aufgabe, Datenbankänderungen, die andere Teammitglieder vorgenommen haben, in Ihr lokales Projekt/die zugehörige Datenbank zu integrieren. Sie müssen jedoch den zusätzlichen Schritt ausführen, um das Projektschema mit Ihrem lokalen dev db-Schema zu vergleichen und die Mods anzuwenden. Es macht Sinn, aber es scheint auf den ersten Blick umständlich.

DB-Projekte sind ein sehr mächtiges Werkzeug. Sie generieren nicht nur Skripte, sondern können diese sofort anwenden. Achten Sie darauf, Ihre Produktionsdatenbank damit nicht zu zerstören. ;)

Ich mag die VS DB-Projekte sehr und ich gehe davon aus, dass ich dieses Tool in Zukunft für alle meine DB-Projekte verwenden kann.

+ tom

8
Tom A

Die Entwicklungsteams zu verpflichten, ein SQL-Versionsverwaltungssystem zu verwenden, ist kein Wundermittel, das Probleme verhindert. Die Datenbank-Quellcodeverwaltung verursacht zusätzlichen Aufwand, da die Entwickler die an einem Objekt vorgenommenen Änderungen in einem separaten SQL-Skript speichern, den Client für das Quellcodeverwaltungssystem öffnen, die SQL-Skriptdatei mit dem Client einchecken und dann ausführen müssen Übernehmen Sie die Änderungen in die Live-Datenbank.

Ich kann vorschlagen, das SSMS-Add-In mit dem Namen ApexSQL Source Control zu verwenden. Es ermöglicht Entwicklern, Datenbankobjekte mit dem Versionsverwaltungssystem über den Assistenten direkt aus SSMS zuzuordnen. Das Add-In unterstützt TFS, Git, Subversion und andere SC) Systeme. Es unterstützt auch die Quellcodeverwaltung für statische Daten.

Klicken Sie nach dem Herunterladen und Installieren von ApexSQL Source Control mit der rechten Maustaste auf die Datenbank, für die Sie die Versionskontrolle durchführen möchten, und navigieren Sie zum Untermenü ApexSQL Source Control in SSMS. Klicken Sie auf die Option Datenbank mit Quellcodeverwaltung verknüpfen, wählen Sie das Quellcodeverwaltungssystem und das Entwicklungsmodell aus. Danach müssen Sie die Anmeldeinformationen und die Repository-Zeichenfolge für das von Ihnen ausgewählte Versionsverwaltungssystem bereitstellen.

Weitere Informationen finden Sie in diesem Artikel: http://solutioncenter.apexsql.com/sql-source-control-reduce-database-development-time/

8
AliceF

Wir führen die Quellcodeverwaltung für alle von unserer Datenbank erstellten Objekte durch. Um die Entwickler ehrlich zu halten (weil Sie Objekte erstellen können, ohne dass sie sich in der Quellcodeverwaltung befinden), sucht unser dbas in regelmäßigen Abständen nach Objekten, die sich nicht in der Quellcodeverwaltung befinden.

6
HLGEM

Ich speichere Erstellungs-/Aktualisierungsskripte und ein Skript, das Sampledaten generiert.

6
Paco

Ja, wir tun dies, indem wir unser SQL als Teil unseres Builds behalten - wir behalten DROP.sql, CREATE.sql, USERS.sql, VALUES.sql und diese Versionskontrolle bei, so dass wir zu jeder getaggten Version zurückkehren können.

Wir haben auch Ant-Tasks, mit denen die Datenbank bei Bedarf neu erstellt werden kann.

Außerdem wird die SQL dann zusammen mit Ihrem zugehörigen Quellcode markiert.

6
DustinB

Das erfolgreichste Schema, das ich jemals für ein Projekt verwendet habe, enthält kombinierte Sicherungen und differentielle SQL-Dateien. Grundsätzlich würden wir nach jeder Veröffentlichung eine Sicherungskopie unserer Datenbank erstellen und einen SQL-Speicherauszug erstellen, damit wir bei Bedarf auch ein leeres Schema von Grund auf neu erstellen können. Wenn Sie dann eine Änderung an der Datenbank vornehmen müssen, fügen Sie dem SQL-Verzeichnis unter Versionskontrolle einen Änderungs-Scrip hinzu. Wir würden dem Dateinamen immer eine Sequenznummer oder ein Datum voranstellen, sodass die erste Änderung 01_add_created_on_column.sql und das nächste Skript 02_added_customers_index lautet. Unser CI-Computer prüfte diese und führte sie nacheinander auf einer neuen Kopie der Datenbank aus, die aus der Sicherung wiederhergestellt worden war.

Wir hatten auch einige Skripte, mit denen Entwickler ihre lokale Datenbank mit einem einzigen Befehl auf die aktuelle Version zurücksetzen konnten.

6
Mike Deck

Ich verwende SchemaBank , um alle Änderungen an meinem Datenbankschema der Versionskontrolle zu unterziehen:

  • ab dem 1. tag importiere ich meinen db schema dump hinein
  • ich habe angefangen, mein Schema-Design mit einem Webbrowser zu ändern (weil sie SaaS/cloud-basiert)
  • wenn ich meinen DB-Server aktualisieren möchte, generiere ich das Change (SQL) -Skript daraus und wende es auf die DB an. In der Schemabank habe ich den Auftrag, meine Arbeit als Version zu übergeben, bevor ich ein Aktualisierungsskript generieren kann. Ich mag diese Art der Übung, damit ich immer zurückverfolgen kann, wenn ich muss.

Unsere Teamregel ist, NIEMALS den Datenbankserver direkt zu berühren, ohne vorher die Entwurfsarbeit zu speichern. Aber es kommt vor, dass jemand versucht sein könnte, die Regel zu brechen, um es ihm recht zu machen. Wir würden den Schemadump erneut in die Schemabank importieren und den Diff ausführen und jemanden schlagen lassen, wenn eine Diskrepanz gefunden wird. Obwohl wir die Änderungsskripte daraus generieren könnten, um unser Datenbank- und Schemadesign zu synchronisieren, hassen wir das einfach.

Übrigens können wir auch Zweige innerhalb des Versionskontrollbaums erstellen, sodass ich einen für die Bereitstellung und einen für die Produktion pflegen kann. Und eine zum Codieren von Sandbox.

Ein hübsches webbasiertes Schema-Design-Tool mit Versionskontrolle und Änderungsmanagement.

5
Leigh Pyle

Ich verwende SQL CREATE-Skripte, die aus MySQL Workbech exportiert wurden, und verwende dann deren "Export SQL ALTER" -Funktionalität. Am Ende stehen eine Reihe von Erstellungsskripten (natürlich nummeriert) und die Änderungsskripten, die die Änderungen zwischen ihnen anwenden können.

3.- SQL ALTER-Skript exportieren Normalerweise müssten Sie die ALTER TABLE-Anweisungen jetzt von Hand schreiben, um Ihre am Modell vorgenommenen Änderungen widerzuspiegeln. Aber Sie können schlau sein und Workbench die harte Arbeit für Sie erledigen lassen. Wählen Sie einfach Datei -> Exportieren -> Forward Engineer SQL ALTER Script… aus dem Hauptmenü.

Dadurch werden Sie aufgefordert, die SQL CREATE-Datei anzugeben, mit der das aktuelle Modell verglichen werden soll.

Wählen Sie das SQL CREATE-Skript aus Schritt 1 aus. Das Tool generiert dann das ALTER TABLE-Skript für Sie und Sie können dieses Skript für Ihre Datenbank ausführen, um es auf den neuesten Stand zu bringen.

Sie können dies mit dem MySQL Query Browser oder dem mysql client.Voila! Ihr Modell und Ihre Datenbank wurden jetzt synchronisiert!

Quelle: MySQL Workbench Community Edition: Anleitung zur Schemasynchronisation

Alle diese Skripte befinden sich natürlich innerhalb der Versionskontrolle.

4
levhita

Wenn Ihre Datenbank SQL Server ist, haben wir möglicherweise genau die Lösung, nach der Sie suchen. SQL Source Control 1.0 wurde nun veröffentlicht.

http://www.red-gate.com/products/SQL_Source_Control/index.htm

Dies wird in SSMS integriert und stellt den Klebstoff zwischen Ihren Datenbankobjekten und Ihrem VCS bereit. Das 'Scripting out' geschieht transparent (es verwendet die SQL Compare Engine unter der Haube), was die Verwendung so einfach machen sollte, dass Entwickler nicht davon abgehalten werden, den Prozess zu übernehmen.

Eine alternative Visual Studio-Lösung ist ReadyRoll , die als Untertyp des SSDT-Datenbankprojekts implementiert ist. Hierbei wird ein migrationsgesteuerter Ansatz verfolgt, der besser auf die Automatisierungsanforderungen der DevOps-Teams zugeschnitten ist.

4
David Atkinson

Es wurde viel über das Datenbankmodell selbst diskutiert, aber wir behalten auch die erforderlichen Daten in .SQL-Dateien.

Zum Beispiel, um nützlich zu sein, könnte Ihre Anwendung dies bei der Installation benötigen:

INSERT INTO Currency (CurrencyCode, CurrencyName) 
VALUES ('AUD', 'Australian Dollars');

INSERT INTO Currency (CurrencyCode, CurrencyName) 
VALUES ('USD', 'US Dollars');

Wir hätten eine Datei namens currency.sql unter Subversion. Als manuellen Schritt im Build-Prozess vergleichen wir die vorherige currency.sql mit der neuesten und schreiben ein Upgrade-Skript.

4
WW.

Ja immer. Sie sollten in der Lage sein, Ihre Produktionsdatenbankstruktur bei Bedarf mit einem nützlichen Satz von Beispieldaten neu zu erstellen. Wenn Sie dies nicht tun, werden im Laufe der Zeit kleinere Änderungen, um die Dinge am Laufen zu halten, vergessen. Eines Tages werden Sie gebissen, große Zeit. Es ist eine Versicherung, die Sie vielleicht nicht für nötig halten, aber am Tag, an dem Sie sie abschließen, ist sie den Preis zehnmal wert!

4
AndrewB

Ich habe alles Nötige, um meine Datenbank aus Bare-Metal-Daten abzüglich der Daten selbst neu zu erstellen. Ich bin sicher, es gibt viele Möglichkeiten, dies zu tun, aber alle meine Skripte und dergleichen sind in Subversion gespeichert und wir können die DB-Struktur und dergleichen neu erstellen, indem wir alles aus Subversion ziehen und ein Installationsprogramm ausführen.

4
itsmatt

Wir haben die Versions- und Quellcodeverwaltung für unsere Datenbanken:

  • DDL (erstellen und ändern)
  • DML (Referenzdaten, Codes usw.)
  • Datenmodelländerungen (mit ERwin oder ER/Studio)
  • Datenbankkonfigurationsänderungen (Berechtigungen, Sicherheitsobjekte, allgemeine Konfigurationsänderungen)

All dies erledigen wir mit automatisierten Jobs, die Change Manager und einige benutzerdefinierte Skripte verwenden. Der Change Manager überwacht diese Änderungen und benachrichtigt Sie, wenn sie abgeschlossen sind.

4
Karen Lopez

Normalerweise erstelle ich ein SQL-Skript für jede Änderung, die ich vornehme, und ein anderes, um diese Änderungen rückgängig zu machen und diese Skripts unter Versionskontrolle zu halten.

Dann haben wir die Möglichkeit, bei Bedarf eine neue, aktuelle Datenbank zu erstellen und können problemlos zwischen Revisionen wechseln. Jedes Mal, wenn wir eine Veröffentlichung veröffentlichen, werden die Skripte zusammengefasst (dies erfordert ein wenig manuelle Arbeit, ist aber eigentlich selten schwer), sodass wir auch eine Reihe von Skripten haben, die zwischen Versionen konvertiert werden können.

Ja, bevor du es sagst, ist das sehr ähnlich zu dem, was Rails und andere tun, aber es scheint ziemlich gut zu funktionieren, also habe ich keine Probleme damit, zuzugeben, dass ich die Idee schamlos aufgehoben habe :)

4
Dan

Ich bin der Meinung, dass jede Datenbank der Quellcodeverwaltung unterliegen sollte und dass Entwickler eine einfache Möglichkeit haben sollten, ihre lokale Datenbank von Grund auf neu zu erstellen. Inspiriert von Visual Studio für Datenbankprofis habe ich ein Open-Source-Tool erstellt, das MS SQL-Datenbanken skript und eine einfache Möglichkeit zum Bereitstellen für Ihr lokales DB-Modul bietet. Versuchen Sie http://dbsourcetools.codeplex.com/ . Viel Spaß, - Nathan.

4

Hier ist eine Beispiellösung für einen Trigger, der die Verfolgung von Änderungen an DB-Objekten (über DDL-Anweisungen) in einer SQL Server 2005/2008-Datenbank implementiert. Ich enthält auch ein einfaches Beispiel, wie die Verwendung des erforderlichen someValue xml-Tags im Quellcode für jeden in der Datenbank ausgeführten SQL-Befehl erzwungen werden kann, sowie die Verfolgung der aktuellen Datenbankversion und des aktuellen Datenbanktyps (dev, test, qa, fb, prod ) Man könnte es mit zusätzlichen erforderlichen Attributen wie z. B. erweitern. Der Code ist ziemlich lang - er erstellt die leere Datenbank + die erforderliche Verfolgungstabellenstruktur + die erforderlichen Datenbankfunktionen und den Auslöser für das Auffüllen, die alle unter einem [ga] -Schema ausgeführt werden.

USE [master]
GO

/****** Object:  Database [DBGA_DEV]    Script Date: 04/22/2009 13:22:01 ******/
CREATE DATABASE [DBGA_DEV] ON  PRIMARY 
( NAME = N'DBGA_DEV', FILENAME = N'D:\GENAPP\DATA\DBFILES\DBGA_DEV.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'DBGA_DEV_log', FILENAME = N'D:\GENAPP\DATA\DBFILES\DBGA_DEV_log.ldf' , SIZE = 6208KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [DBGA_DEV] SET COMPATIBILITY_LEVEL = 100
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [DBGA_DEV].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [DBGA_DEV] SET ANSI_NULL_DEFAULT OFF 
GO

ALTER DATABASE [DBGA_DEV] SET ANSI_NULLS OFF 
GO

ALTER DATABASE [DBGA_DEV] SET ANSI_PADDING ON 
GO

ALTER DATABASE [DBGA_DEV] SET ANSI_WARNINGS OFF 
GO

ALTER DATABASE [DBGA_DEV] SET ARITHABORT OFF 
GO

ALTER DATABASE [DBGA_DEV] SET AUTO_CLOSE OFF 
GO

ALTER DATABASE [DBGA_DEV] SET AUTO_CREATE_STATISTICS ON 
GO

ALTER DATABASE [DBGA_DEV] SET AUTO_SHRINK OFF 
GO

ALTER DATABASE [DBGA_DEV] SET AUTO_UPDATE_STATISTICS ON 
GO

ALTER DATABASE [DBGA_DEV] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO

ALTER DATABASE [DBGA_DEV] SET CURSOR_DEFAULT  GLOBAL 
GO

ALTER DATABASE [DBGA_DEV] SET CONCAT_NULL_YIELDS_NULL OFF 
GO

ALTER DATABASE [DBGA_DEV] SET NUMERIC_ROUNDABORT OFF 
GO

ALTER DATABASE [DBGA_DEV] SET QUOTED_IDENTIFIER OFF 
GO

ALTER DATABASE [DBGA_DEV] SET RECURSIVE_TRIGGERS OFF 
GO

ALTER DATABASE [DBGA_DEV] SET  DISABLE_BROKER 
GO

ALTER DATABASE [DBGA_DEV] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO

ALTER DATABASE [DBGA_DEV] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO

ALTER DATABASE [DBGA_DEV] SET TRUSTWORTHY OFF 
GO

ALTER DATABASE [DBGA_DEV] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO

ALTER DATABASE [DBGA_DEV] SET PARAMETERIZATION SIMPLE 
GO

ALTER DATABASE [DBGA_DEV] SET READ_COMMITTED_SNAPSHOT OFF 
GO

ALTER DATABASE [DBGA_DEV] SET HONOR_BROKER_PRIORITY OFF 
GO

ALTER DATABASE [DBGA_DEV] SET  READ_WRITE 
GO

ALTER DATABASE [DBGA_DEV] SET RECOVERY FULL 
GO

ALTER DATABASE [DBGA_DEV] SET  MULTI_USER 
GO

ALTER DATABASE [DBGA_DEV] SET PAGE_VERIFY CHECKSUM  
GO

ALTER DATABASE [DBGA_DEV] SET DB_CHAINING OFF 
GO

EXEC [DBGA_DEV].sys.sp_addextendedproperty @name=N'DbType', @value=N'DEV' 
GO

EXEC [DBGA_DEV].sys.sp_addextendedproperty @name=N'DbVersion', @value=N'0.0.1.20090414.1100' 
GO



USE [DBGA_DEV]
GO
/****** Object:  Schema [ga]    Script Date: 04/22/2009 13:21:29 ******/
CREATE SCHEMA [ga] AUTHORIZATION [dbo]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Contains the objects of the Generic Application database' , @level0type=N'SCHEMA',@level0name=N'ga'
GO
/****** Object:  Table [ga].[tb_DataMeta_ObjChangeLog]    Script Date: 04/22/2009 13:21:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [ga].[tb_DataMeta_ObjChangeLog](
    [LogId] [int] IDENTITY(1,1) NOT NULL,
    [TimeStamp] [timestamp] NOT NULL,
    [DatabaseName] [varchar](256) NOT NULL,
    [SchemaName] [varchar](256) NOT NULL,
    [DbVersion] [varchar](20) NOT NULL,
    [DbType] [varchar](20) NOT NULL,
    [EventType] [varchar](50) NOT NULL,
    [ObjectName] [varchar](256) NOT NULL,
    [ObjectType] [varchar](25) NOT NULL,
    [Version] [varchar](50) NULL,
    [SqlCommand] [varchar](max) NOT NULL,
    [EventDate] [datetime] NOT NULL,
    [LoginName] [varchar](256) NOT NULL,
    [FirstName] [varchar](256) NULL,
    [LastName] [varchar](50) NULL,
    [ChangeDescription] [varchar](1000) NULL,
    [Description] [varchar](1000) NULL,
    [ObjVersion] [varchar](20) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The database version as written in the extended prop of the database' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'TABLE',@level1name=N'tb_DataMeta_ObjChangeLog', @level2type=N'COLUMN',@level2name=N'DbVersion'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'dev , test , qa , fb or prod' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'TABLE',@level1name=N'tb_DataMeta_ObjChangeLog', @level2type=N'COLUMN',@level2name=N'DbType'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The name of the object as it is registered in the sys.objects ' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'TABLE',@level1name=N'tb_DataMeta_ObjChangeLog', @level2type=N'COLUMN',@level2name=N'ObjectName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'TABLE',@level1name=N'tb_DataMeta_ObjChangeLog', @level2type=N'COLUMN',@level2name=N'Description'
GO
SET IDENTITY_INSERT [ga].[tb_DataMeta_ObjChangeLog] ON
INSERT [ga].[tb_DataMeta_ObjChangeLog] ([LogId], [DatabaseName], [SchemaName], [DbVersion], [DbType], [EventType], [ObjectName], [ObjectType], [Version], [SqlCommand], [EventDate], [LoginName], [FirstName], [LastName], [ChangeDescription], [Description], [ObjVersion]) VALUES (3, N'DBGA_DEV', N'en', N'0.0.1.20090414.1100', N'DEV', N'DROP_TABLE', N'tb_BL_Products', N'TABLE', N' some', N'<EVENT_INSTANCE><EventType>DROP_TABLE</EventType><PostTime>2009-04-22T11:03:11.880</PostTime><SPID>57</SPID><ServerName>YSG</ServerName><LoginName>ysg\yordgeor</LoginName><UserName>dbo</UserName><DatabaseName>DBGA_DEV</DatabaseName><SchemaName>en</SchemaName><ObjectName>tb_BL_Products</ObjectName><ObjectType>TABLE</ObjectType><TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/><CommandText>drop TABLE [en].[tb_BL_Products] --<Version> some</Version>&#x0D;
</CommandText></TSQLCommand></EVENT_INSTANCE>', CAST(0x00009BF300B6271C AS DateTime), N'ysg\yordgeor', N'Yordan', N'Georgiev', NULL, NULL, N'0.0.0')
INSERT [ga].[tb_DataMeta_ObjChangeLog] ([LogId], [DatabaseName], [SchemaName], [DbVersion], [DbType], [EventType], [ObjectName], [ObjectType], [Version], [SqlCommand], [EventDate], [LoginName], [FirstName], [LastName], [ChangeDescription], [Description], [ObjVersion]) VALUES (4, N'DBGA_DEV', N'en', N'0.0.1.20090414.1100', N'DEV', N'CREATE_TABLE', N'tb_BL_Products', N'TABLE', N' 2.2.2 ', N'<EVENT_INSTANCE><EventType>CREATE_TABLE</EventType><PostTime>2009-04-22T11:03:18.620</PostTime><SPID>57</SPID><ServerName>YSG</ServerName><LoginName>ysg\yordgeor</LoginName><UserName>dbo</UserName><DatabaseName>DBGA_DEV</DatabaseName><SchemaName>en</SchemaName><ObjectName>tb_BL_Products</ObjectName><ObjectType>TABLE</ObjectType><TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/><CommandText>CREATE TABLE [en].[tb_BL_Products](&#x0D;
    [ProducId] [int] NULL,&#x0D;
    [ProductName] [nchar](10) NULL,&#x0D;
    [ProductDescription] [varchar](5000) NULL&#x0D;
) ON [PRIMARY]&#x0D;
/*&#x0D;
<Version> 2.2.2 </Version>&#x0D;
&#x0D;
*/&#x0D;
</CommandText></TSQLCommand></EVENT_INSTANCE>', CAST(0x00009BF300B62F07 AS DateTime), N'ysg\yordgeor', N'Yordan', N'Georgiev', NULL, NULL, N'0.0.0')
INSERT [ga].[tb_DataMeta_ObjChangeLog] ([LogId], [DatabaseName], [SchemaName], [DbVersion], [DbType], [EventType], [ObjectName], [ObjectType], [Version], [SqlCommand], [EventDate], [LoginName], [FirstName], [LastName], [ChangeDescription], [Description], [ObjVersion]) VALUES (5, N'DBGA_DEV', N'en', N'0.0.1.20090414.1100', N'DEV', N'DROP_TABLE', N'tb_BL_Products', N'TABLE', N' 2.2.2 ', N'<EVENT_INSTANCE><EventType>DROP_TABLE</EventType><PostTime>2009-04-22T11:25:12.620</PostTime><SPID>57</SPID><ServerName>YSG</ServerName><LoginName>ysg\yordgeor</LoginName><UserName>dbo</UserName><DatabaseName>DBGA_DEV</DatabaseName><SchemaName>en</SchemaName><ObjectName>tb_BL_Products</ObjectName><ObjectType>TABLE</ObjectType><TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/><CommandText>drop TABLE [en].[tb_BL_Products] &#x0D;
</CommandText></TSQLCommand></EVENT_INSTANCE>', CAST(0x00009BF300BC32F1 AS DateTime), N'ysg\yordgeor', N'Yordan', N'Georgiev', NULL, NULL, N'0.0.0')
INSERT [ga].[tb_DataMeta_ObjChangeLog] ([LogId], [DatabaseName], [SchemaName], [DbVersion], [DbType], [EventType], [ObjectName], [ObjectType], [Version], [SqlCommand], [EventDate], [LoginName], [FirstName], [LastName], [ChangeDescription], [Description], [ObjVersion]) VALUES (6, N'DBGA_DEV', N'en', N'0.0.1.20090414.1100', N'DEV', N'CREATE_TABLE', N'tb_BL_Products', N'TABLE', N' 2.2.2 ', N'<EVENT_INSTANCE><EventType>CREATE_TABLE</EventType><PostTime>2009-04-22T11:25:19.053</PostTime><SPID>57</SPID><ServerName>YSG</ServerName><LoginName>ysg\yordgeor</LoginName><UserName>dbo</UserName><DatabaseName>DBGA_DEV</DatabaseName><SchemaName>en</SchemaName><ObjectName>tb_BL_Products</ObjectName><ObjectType>TABLE</ObjectType><TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/><CommandText>CREATE TABLE [en].[tb_BL_Products](&#x0D;
    [ProducId] [int] NULL,&#x0D;
    [ProductName] [nchar](10) NULL,&#x0D;
    [ProductDescription] [varchar](5000) NULL&#x0D;
) ON [PRIMARY]&#x0D;
/*&#x0D;
<Version> 2.2.2 </Version>&#x0D;
&#x0D;
*/&#x0D;
</CommandText></TSQLCommand></EVENT_INSTANCE>', CAST(0x00009BF300BC3A69 AS DateTime), N'ysg\yordgeor', N'Yordan', N'Georgiev', NULL, NULL, N'0.0.0')
SET IDENTITY_INSERT [ga].[tb_DataMeta_ObjChangeLog] OFF
/****** Object:  Table [ga].[tb_BLSec_LoginsForUsers]    Script Date: 04/22/2009 13:21:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [ga].[tb_BLSec_LoginsForUsers](
    [LoginsForUsersId] [int] IDENTITY(1,1) NOT NULL,
    [LoginName] [nvarchar](100) NOT NULL,
    [FirstName] [varchar](100) NOT NULL,
    [SecondName] [varchar](100) NULL,
    [LastName] [varchar](100) NOT NULL,
    [DomainName] [varchar](100) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
SET IDENTITY_INSERT [ga].[tb_BLSec_LoginsForUsers] ON
INSERT [ga].[tb_BLSec_LoginsForUsers] ([LoginsForUsersId], [LoginName], [FirstName], [SecondName], [LastName], [DomainName]) VALUES (1, N'ysg\yordgeor', N'Yordan', N'Stanchev', N'Georgiev', N'yordgeor')
SET IDENTITY_INSERT [ga].[tb_BLSec_LoginsForUsers] OFF
/****** Object:  Table [en].[tb_BL_Products]    Script Date: 04/22/2009 13:21:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [en].[tb_BL_Products](
    [ProducId] [int] NULL,
    [ProductName] [nchar](10) NULL,
    [ProductDescription] [varchar](5000) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  StoredProcedure [ga].[procUtils_SqlCheatSheet]    Script Date: 04/22/2009 13:21:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [ga].[procUtils_SqlCheatSheet]                

as                 
set nocount on                 

--what was the name of the table with something like role                
/*                
SELECT * from sys.tables where [name] like '%POC%'                
*/                
-- what are the columns of this table                 
/*                
select column_name , DATA_TYPE , CHARACTER_MAXIMUM_LENGTH,  table_name  from Information_schema.columns where table_name='tbGui_ExecutePOC'                
*/                

-- find proc        
--what was the name of procedure with something like role                
/*                
select * from sys.procedures where [name] like '%ext%'                
exec sp_HelpText procName        
*/                
/*                
exec sp_helpText procUtils_InsertGenerator                
*/                
--how to list all databases in sql server                 
/*                
SELECT database_id AS ID, NULL AS ParentID, name AS Text FROM sys.databases ORDER BY [name]                
*/                

--HOW-TO LIST ALL TABLES IN A SQL SERVER 2005 DATABASE                
/*                
SELECT TABLE_NAME FROM [POC].INFORMATION_SCHEMA.TABLES                
WHERE TABLE_TYPE = 'BASE TABLE'                  
AND TABLE_NAME <> 'dtproperties'                  
ORDER BY TABLE_NAME                


*/                
--HOW-TO ENABLE XP_CMDSHELL START                
-------------------------------------------------------------------------                
-- configure verbose mode temporarily                 
-- EXECUTE sp_configure 'show advanced options', 1                 
-- RECONFIGURE WITH OVERRIDE                 
--GO                 


--ENABLE xp_cmdshell                 
-- EXECUTE sp_configure 'xp_cmdshell', '1'                 
-- RECONFIGURE WITH OVERRIDE                 
-- EXEC SP_CONFIGURE 'show advanced option', '1';                 
-- SHOW THE CONFIGURATION                 
-- EXEC SP_CONFIGURE;                 


--turn show advance options off                 
-- GO                 
--EXECUTE sp_configure 'show advanced options', 0                 
-- RECONFIGURE WITH OVERRIDE                 
-- GO                

--HOW-TO ENABLE XP_CMDSHELL END                
-------------------------------------------------------------------------                

--HOW-TO IMPLEMENT SLEEP                 
-- sleep for 10 seconds                 
-- WAITFOR DELAY '00:00:10' SELECT * FROM My_Table                

/* LIST ALL PRIMARY KEYS                 

SELECT                 
  INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_NAME AS TABLE_NAME,                
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME AS COLUMN_NAME,                 
  REPLACE(INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE,' ', '_') AS CONSTRAINT_TYPE                 
FROM                 
  INFORMATION_SCHEMA.TABLE_CONSTRAINTS                 
  INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ON                 
  INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME =                 
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME                 
WHERE                 
  INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_NAME <> N'sysdiagrams'                 
ORDER BY                 
  INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_NAME ASC                

*/                

--HOW-TO COPY TABLE AND THE WHOLE TABLE DATA , COPY TABLE FROM DB TO DB                
--==================================================START                 
/*                
use Poc_Dev                
go                
drop table tbGui_LinksVisibility                

use POc_test                
go                
select *                 
INTO [POC_Dev].[ga].[tbGui_LinksVisibility]                
from [POC_TEST].[ga].[tbGui_LinksVisibility]                


*/                
--HOW-TO COPY TABLE AND THE WHOLE TABLE DATA , COPY TABLE FROM DB TO DB                
--====================================================END                
--=================================================== SEE TABLE METADATA START                
/*                



SELECT c.name AS [COLUMN_NAME], sc.data_type AS [DATA_TYPE], [value] AS                 
[DESCRIPTION] , c.max_length as [MAX_LENGTH] , c.is_nullable AS [OPTIONAL]                 
, c.is_identity AS [IS_PRIMARY_KEY] FROM sys.extended_properties AS ep                 
INNER JOIN sys.tables AS t ON ep.major_id = t.object_id                 
INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id                 
= c.column_id                 
INNER JOIN INFORMATION_SCHEMA.COLUMNS sc ON t.name = sc.table_name and                 
c.name = sc.column_name                 
WHERE class = 1 and t.name = 'tbGui_ExecutePOC' ORDER BY SC.DATA_TYPE                


*/                
--=================================================== SEE TABLE METADATA END               
    /*            
select * from Information_schema.columns                
select table_name , column_name from Information_schema.columns where table_name='tbGui_Wizards'                
    */            


--=================================================== LIST ALL TABLES AND THEIR DESCRIPTOINS START                
/*                

SELECT T.name AS TableName, CAST(Props.value AS varchar(1000)) AS                
TableDescription                
FROM sys.tables AS T LEFT OUTER JOIN                
(SELECT class, class_desc, major_id, minor_id,                
name, value                
FROM sys.extended_properties                
WHERE (minor_id = 0) AND (class = 1)) AS                
Props ON T.object_id = Props.major_id                
WHERE (T.type = 'U') AND (T.name <> N'sysdiagrams')                
ORDER BY TableName                
*/                
--=================================================== LIST ALL TABLES AND THEIR DESCRIPTOINS START                

--=================================================== LIST ALL OBJECTS FROM DB START                
/*                


use DB                
--HOW-TO LIST ALL PROCEDURE IN A DATABASE                
select s.name from sysobjects s where type = 'P'                
--HOW-TO LIST ALL TRIGGERS BY NAME IN A DATABASE                
select s.name from sysobjects s where type = 'TR'                
--HOW-TO LIST TABLES IN A DATABASE                 
select s.name from sysobjects s where type = 'U'                
--how-to list all system tables in a database                
select s.name from sysobjects s where type = 's'                
--how-to list all the views in a database                
select s.name from sysobjects s where type = 'v'                


*/                

/*                
Similarly you can find out other objects created by user, simple change type =                 

C = CHECK constraint                 

D = Default or DEFAULT constraint                 

F = FOREIGN KEY constraint                 

L = Log                 

FN = Scalar function                 

IF = In-lined table-function                 

P = Stored procedure                 

PK = PRIMARY KEY constraint (type is K)                 

RF = Replication filter stored procedure                

S = System table                 

TF = Table function                 

TR = Trigger                 

U = User table ( this is the one I discussed above in the example)                

UQ = UNIQUE constraint (type is K)                 

V = View                 

X = Extended stored procedure                
*/                



--=================================================== HOW-TO SEE ALL MY PERMISSIONS START                


/*                

SELECT * FROM fn_my_permissions(NULL, 'SERVER');                
USE poc_qa;                
SELECT * FROM fn_my_permissions (NULL, 'database');                
GO                

*/                
--=================================================== HOW-TO SEE ALL MY PERMISSIONS END                

/*               
--find table               

use poc_dev               
go               
select s.name from sysobjects s where type = 'u'  and s.name like '%Visibility%'              
select * from tbGui_LinksVisibility              

*/              

/* find cursor              

use poc      
go        
DECLARE @procName varchar(100)        
DECLARE @cursorProcNames CURSOR        
SET @cursorProcNames = CURSOR FOR        
select name from sys.procedures where modify_date > '2009-02-05 13:12:15.273' order by modify_date desc       

OPEN @cursorProcNames        
FETCH NEXT        
FROM @cursorProcNames INTO @procName        
WHILE @@FETCH_STATUS = 0        
BEGIN        

set nocount off;        
exec sp_HelpText @procName --- or print them        
-- print @procName        

FETCH NEXT        
FROM @cursorProcNames INTO @procName        
END        
CLOSE @cursorProcNames        

select @@error    

*/              


/* --  SEE STORED PROCEDURE EXT PROPS            

SELECT ep.name as 'EXT_PROP_NAME' , SP.NAME , [value] as 'DESCRIPTION' FROM sys.extended_properties as ep left join sys.procedures as sp on sp.object_id = ep.major_id where sp.type='P'            


-- what the hell I ve been doing lately on sql server 2005 / 2008
select o.name , 
(SELECT [definition] AS [text()] FROM sys.all_sql_modules where sys.all_sql_modules.object_id=a.object_id FOR XML PATH(''), TYPE) AS Statement_Text
, a.object_id, o.modify_date from sys.all_sql_modules a left join sys.objects o on a.object_id=o.object_id order by 4 desc



-- GET THE RIGHT LANG SCHEMA START 
DECLARE @template AS varchar(max)
SET @template = 'SELECT * FROM {object_name}'

DECLARE @object_name AS sysname

SELECT @object_name = QUOTENAME(s.name) + '.' + QUOTENAME(o.name)
FROM sys.objects o
INNER JOIN sys.schemas s
    ON s.schema_id = o.schema_id
WHERE o.object_id = OBJECT_ID(QUOTENAME(@LANG) + '.[TestingLanguagesInNameSpacesDelMe]')

IF @object_name IS NOT NULL
BEGIN
    DECLARE @sql AS varchar(max)
    SET @sql = REPLACE(@template, '{object_name}', @object_name)
    EXEC (@sql)
END
-- GET THE RIGHT LANG SCHEMA END 

--  SEE STORED PROCEDURE EXT PROPS end*/             
set nocount off
GO
EXEC sys.sp_addextendedproperty @name=N'AuthorName', @value=N'Yordan Georgiev' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'PROCEDURE',@level1name=N'procUtils_SqlCheatSheet'
GO
EXEC sys.sp_addextendedproperty @name=N'ProcDescription', @value=N'TODO:ADD HERE DESCRPIPTION' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'PROCEDURE',@level1name=N'procUtils_SqlCheatSheet'
GO
EXEC sys.sp_addextendedproperty @name=N'ProcVersion', @value=N'0.1.0.20090406.1317' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'PROCEDURE',@level1name=N'procUtils_SqlCheatSheet'
GO
/****** Object:  UserDefinedFunction [ga].[GetDbVersion]    Script Date: 04/22/2009 13:21:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [ga].[GetDbVersion]()
RETURNS VARCHAR(20)
    BEGIN
        RETURN convert(varchar(20) , (select value from sys.extended_properties where name='DbVersion' and class_desc='DATABASE') )
    END
GO
EXEC sys.sp_addextendedproperty @name=N'AuthorName', @value=N'Yordan Georgiev' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'FUNCTION',@level1name=N'GetDbVersion'
GO
EXEC sys.sp_addextendedproperty @name=N'ChangeDescription', @value=N'Initial creation' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'FUNCTION',@level1name=N'GetDbVersion'
GO
EXEC sys.sp_addextendedproperty @name=N'CreatedWhen', @value=N'getDate()' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'FUNCTION',@level1name=N'GetDbVersion'
GO
EXEC sys.sp_addextendedproperty @name=N'Description', @value=N'Gets the current version of the database ' , @level0type=N'SCHEMA',@level0name=N'ga', @level1type=N'FUNCTION',@level1name=N'GetDbVersion'
GO
/****** Object:  UserDefinedFunction [ga].[GetDbType]    Script Date: 04/22/2009 13:21:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [ga].[GetDbType]()
RETURNS VARCHAR(30)
    BEGIN
        RETURN convert(varchar(30) , (select value from sys.extended_properties where name='DbType' and class_desc='DATABASE') )
    END
GO
/****** Object:  Default [DF_tb_DataMeta_ObjChangeLog_DbVersion]    Script Date: 04/22/2009 13:21:40 ******/
ALTER TABLE [ga].[tb_DataMeta_ObjChangeLog] ADD  CONSTRAINT [DF_tb_DataMeta_ObjChangeLog_DbVersion]  DEFAULT ('select ga.GetDbVersion()') FOR [DbVersion]
GO
/****** Object:  Default [DF_tb_DataMeta_ObjChangeLog_EventDate]    Script Date: 04/22/2009 13:21:40 ******/
ALTER TABLE [ga].[tb_DataMeta_ObjChangeLog] ADD  CONSTRAINT [DF_tb_DataMeta_ObjChangeLog_EventDate]  DEFAULT (getdate()) FOR [EventDate]
GO
/****** Object:  Default [DF_tb_DataMeta_ObjChangeLog_ObjVersion]    Script Date: 04/22/2009 13:21:40 ******/
ALTER TABLE [ga].[tb_DataMeta_ObjChangeLog] ADD  CONSTRAINT [DF_tb_DataMeta_ObjChangeLog_ObjVersion]  DEFAULT ('0.0.0') FOR [ObjVersion]
GO
/****** Object:  DdlTrigger [trigMetaDoc_TraceDbChanges]    Script Date: 04/22/2009 13:21:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create trigger [trigMetaDoc_TraceDbChanges]
on database
for create_procedure, alter_procedure, drop_procedure,
create_table, alter_table, drop_table,
create_function, alter_function, drop_function , 
create_trigger , alter_trigger , drop_trigger 
as

set nocount on

declare @data xml
set @data = EVENTDATA()
declare @DbVersion varchar(20)
set @DbVersion =(select ga.GetDbVersion())
declare @DbType varchar(20)
set @DbType =(select ga.GetDbType())
declare @DbName varchar(256)
set @DbName [email protected]('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)')
declare @EventType varchar(256)
set @EventType [email protected]('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)')
declare @ObjectName varchar(256)
set @ObjectName  = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)')
declare @ObjectType varchar(25)
set @ObjectType = @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)')
declare @TSQLCommand varchar(max)
set @TSQLCommand = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)')
declare @opentag varchar(4)
set @opentag= '&lt;'
declare @closetag varchar(4) 
set @closetag= '&gt;'
declare @newDataTxt varchar(max) 
set @newDataTxt= cast(@data as varchar(max))
set @newDataTxt = REPLACE ( REPLACE(@newDataTxt , @opentag , '<') , @closetag , '>')
-- print @newDataTxt
declare @newDataXml xml 
set @newDataXml = CONVERT ( xml , @newDataTxt)
declare @Version varchar(50)
set @Version = @newDataXml.value('(/EVENT_INSTANCE/TSQLCommand/CommandText/Version)[1]', 'varchar(50)')

-- if we are dropping take the version from the existing object 
if  ( SUBSTRING(@EventType , 0 , 5)) = 'DROP'
set @Version =( select top 1 [Version]  from ga.tb_DataMeta_ObjChangeLog where [email protected] order by [LogId] desc)



declare @LoginName varchar(256) 
set @LoginName = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)')
declare @FirstName varchar(50)
set @FirstName= (select [FirstName] from [ga].[tb_BLSec_LoginsForUsers] where [LoginName] = @LoginName)
declare @LastName varchar(50)
set @LastName  = (select [LastName] from [ga].[tb_BLSec_LoginsForUsers] where [LoginName] = @LoginName)
declare @SchemaName sysname 
set @SchemaName = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');
--declare @Description xml 
--set @Description = @data.query('(/EVENT_INSTANCE/TSQLCommand/text())')




--print 'VERSION IS ' + @Version
--print @newDataTxt
--print cast(@data as varchar(max))


-- select column_name from information_schema.columns where table_name ='tb_DataMeta_ObjChangeLog'
insert into [ga].[tb_DataMeta_ObjChangeLog]
(
[DatabaseName] ,
[SchemaName],
[DbVersion] ,
[DbType],
[EventType],
[ObjectName],
[ObjectType] ,
[Version],
[SqlCommand] ,
[LoginName] ,
[FirstName],
[LastName] 
)

values(

@DbName,
@SchemaName,
@DbVersion,
@DbType,
@EventType, 
@ObjectName, 
@ObjectType , 
@Version,
@newDataTxt, 
@LoginName , 
@FirstName , 
@LastName
)
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
DISABLE TRIGGER [trigMetaDoc_TraceDbChanges] ON DATABASE
GO
/****** Object:  DdlTrigger [trigMetaDoc_TraceDbChanges]    Script Date: 04/22/2009 13:21:29 ******/
Enable Trigger [trigMetaDoc_TraceDbChanges] ON Database
GO
3
Yordan Georgiev

Wir sind dabei, alle Datenbanken in die Quellcodeverwaltung zu verschieben. Wir verwenden sqlcompare, um die Datenbank zu skripten (leider eine Funktion der Profession Edition) und dieses Ergebnis in SVN zu übertragen.

Der Erfolg Ihrer Implementierung hängt stark von der Kultur und den Praktiken Ihrer Organisation ab. Die Leute hier glauben an die Erstellung einer Datenbank pro Anwendung. Es gibt eine Reihe von Datenbanken, die von den meisten Anwendungen verwendet werden und eine Vielzahl von Abhängigkeiten zwischen Datenbanken verursachen (einige davon sind zirkulär). Das Einfügen der Datenbankschemata in die Quellcodeverwaltung war aufgrund der Interdatabase-Abhängigkeiten, die unsere Systeme aufweisen, bekanntermaßen schwierig.

Viel Glück für Sie, je früher Sie es ausprobieren, desto eher werden Sie Ihre Probleme aussortieren.

3
Min

Das war auch für mich schon immer ein großes Ärgernis - es scheint einfach zu einfach zu sein, eine schnelle Änderung an Ihrer Entwicklungsdatenbank vorzunehmen, sie zu speichern (vergessen, ein Änderungsskript zu speichern), und dann stecken Sie fest. Sie können das, was Sie gerade getan haben, rückgängig machen und erneut ausführen, um das Änderungsskript zu erstellen, oder es von Grund auf neu schreiben, wenn Sie dies natürlich auch möchten, obwohl dies viel Zeit für das Schreiben von Skripten bedeutet.

Ein Tool, das ich in der Vergangenheit verwendet habe und das dabei geholfen hat, ist SQL Delta. Es zeigt Ihnen die Unterschiede zwischen zwei Datenbanken (SQL Server/Oracle, glaube ich) und generiert alle für die Migration von A-> B erforderlichen Änderungsskripten. Ein weiterer Vorteil ist, dass alle Unterschiede zwischen dem Datenbankinhalt zwischen der Produktions oder Test-) Datenbank und Ihrer Entwicklungsdatenbank angezeigt werden. Da in immer mehr Apps die Konfiguration und der Status gespeichert werden, die für die Ausführung in Datenbanktabellen von entscheidender Bedeutung sind, kann es sehr schwierig sein, Änderungsskripts zu verwenden, mit denen die richtigen Zeilen entfernt, hinzugefügt und geändert werden. SQL Delta zeigt die Zeilen in der Datenbank so an, wie sie in einem Diff-Tool aussehen würden - geändert, hinzugefügt, gelöscht.

Ein exzellentes Werkzeug. Hier ist der Link: --- (http://www.sqldelta.com/

3
Sam Schutte

Diese Frage hat zwar viele gute Antworten, die meisten berücksichtigen jedoch nicht die Veränderungen auf dem Markt für Innovationen, insbesondere bei kommerziellen Tools.

Hier ist eine kurze Liste der Tools, die die Versionskontrolle für Datenbanken durchführen. Ich habe die Vor- und Nachteile der einzelnen Tools aufgelistet (vollständiger Discloser: Ich arbeite für DBmaestro).

Red-Gate - ist seit vielen Jahren auf dem Markt. Es ermöglicht die Versionskontrolle von Datenbankobjekten mithilfe von Skripten, die in die dateibasierte Versionskontrolle integriert sind.

DBVS - Versionskontrolle der Datenbankobjekte mithilfe von Skripten, die in die dateibasierte Versionskontrolle integriert sind.

DBmaestro - Bietet eine Durchsetzung der Versionskontrollprozesse (Auschecken/Einchecken) für die realen Datenbankobjekte. Es steht also außer Frage, ob das Versionskontroll-Repository mit der von der Anwendung verwendeten Datenbank synchronisiert ist.

Ich möchte Sie ermutigen, eine umfassende, unvoreingenommene Rezension zu Database Enforced Change Management-Lösungen des erfahrenen Datenbankexperten Ben Taylor zu lesen, die er auf LinkedIn veröffentlicht hat https://www.linkedin.com/Pulse/article/20140907002729-287832- Datenbank-Änderungsverwaltung mit dbmaestro lösen

3
Uri

Ich habe das Tool dbdeploy von ThoughtWorks unter http://dbdeploy.com/ verwendet. Es wird die Verwendung von Migrationsskripten empfohlen. In jeder Version haben wir die Änderungsskripts in einer einzigen Datei zusammengefasst, um das Verständnis zu erleichtern und den DBAs zu ermöglichen, die Änderungen zu "segnen".

3
David Medinets

Zu Ihrer Information Dies wurde auch vor ein paar Tagen von Dana ... Gespeicherte Prozeduren/DB-Schema in der Quellcodeverwaltung angesprochen

3
Robert Paulson

RedGate ist großartig, wir generieren neue Snapshots, wenn Datenbankänderungen vorgenommen werden (eine winzige Binärdatei) und behalten diese Datei als Ressource in den Projekten. Wann immer wir die Datenbank aktualisieren müssen, verwenden wir das RedGate-Toolkit, um die Datenbank zu aktualisieren und neue Datenbanken aus leeren Datenbanken zu erstellen.

RedGate erstellt auch Datenschnappschüsse, mit denen ich nicht persönlich gearbeitet habe, die aber genauso robust sind.

3
Tom Anderson

Ich versorge das Datenbankschema mit einer Quellcodeverwaltung, indem ich alle Objekte (Tabellendefinitionen, Indizes, gespeicherte Prozeduren usw.) mit einem Skript versorge. Bezüglich der Daten selbst verlassen Sie sich einfach auf regelmäßige Sicherungen. Dadurch wird sichergestellt, dass alle strukturellen Änderungen mit dem korrekten Revisionsverlauf erfasst werden, die Datenbank jedoch nicht bei jeder Datenänderung belastet wird.

3
Ben Hoffstein

In unserem Unternehmen verwenden wir Datenbankänderungsskripte. Wenn ein Skript ausgeführt wird, wird sein Name in der Datenbank gespeichert und nicht erneut ausgeführt, es sei denn, diese Zeile wird entfernt. Die Namen der Skripte basieren auf Datum, Uhrzeit und Code-Verzweigung, sodass eine kontrollierte Ausführung möglich ist.

Viele, viele Tests werden durchgeführt, bevor die Skripte in der Live-Umgebung ausgeführt werden, sodass "Oopsies" im Allgemeinen nur in Entwicklungsdatenbanken auftreten.

3
Wes P

Mein Team versioniert unser Datenbankschema als C # -Klassen mit dem Rest unseres Codes. Wir haben ein selbst entwickeltes C # -Programm (<500 Codezeilen), das die Klassen widerspiegelt und SQL-Befehle zum Erstellen, Löschen und Aktualisieren der Datenbank erstellt. Nach dem Erstellen der Datenbank führen wir sqlmetal aus, um ein Linq-Mapping zu generieren, das dann in einem anderen Projekt kompiliert wird, das zum Generieren von Testdaten verwendet wird. Das Ganze funktioniert sehr gut, da der Datenzugriff beim Kompilieren überprüft wird. Wir finden es gut, weil das Schema in einer .cs-Datei gespeichert ist, die in trac/svn leicht zu verfolgen ist.

2
user20620

Ich habe RedGate SQL Compare Pro für die Schemasynchronisierung mit dem Skriptordner verwendet und dann mein gesamtes Update der Versionskontrolle übergeben. Es funktioniert super.

2
user14808

Die RedGate-Software bietet einige großartige Tools, mit denen Sie Ihre Datenbank versionieren können. Stellen Sie sicher, dass Ihre Entwickler ihre eigenen isolierten lokalen Datenbanken für die Entwicklung erstellen, anstatt sich auf einen "Entwickler-Server" zu verlassen, der zu einem bestimmten Zeitpunkt ausfallen kann oder nicht.

2

Wow, so viele Antworten. Für eine solide Datenbankversionierung müssen Sie den Code, der Ihre Datenbank ändert, versionieren. Einige CMS bieten Konfigurationsverwaltungstools an, z. B. das in Drupal= 8. Hier eine Übersicht mit praktischen Schritten zu ordnen Sie Ihren Workflow und stellen Sie sicher, dass die Datenbankkonfiguration versioniert ist , Auch in Teamumgebungen:

2
Ivan Grynenko

Ich überprüfe meine Datenbankstruktur-Dumps immer in der Quellcodeverwaltung. Vollständige Datenbank-Dumps werden jedoch normalerweise nur komprimiert und zur Speicherung abgelegt.

2
Adam Gibbins

Ja ... unsere Datenbanken sind in ERwin erstellt und die DDLs für jede Version werden automatisch generiert. Die ERwin-Dateien werden in unserem Quellcodeverwaltungssystem gespeichert (genau wie unsere technischen Dokumente).

2
Steve Moyer

Wir verwenden Replikation und Clustering, um unsere Datenbanken sowie Sicherungen zu verwalten. Wir verwenden Serena, um unsere SQL-Skripte und Konfigurationsimplementierungen zu verwalten. Bevor eine Konfigurationsänderung vorgenommen wird, führen wir im Rahmen des Änderungsmanagements eine Sicherung durch. Diese Sicherung erfüllt unsere Rollback-Anforderung.

Ich denke, das hängt alles vom Maßstab ab. Sprechen Sie über Unternehmensanwendungen, die Offsite-Backups und Disaster Recovery benötigen? Eine kleine Arbeitsgruppe, die eine Buchhaltungsanwendung ausführt? Oder überall dazwischen?

2
Robert S.

Ich habe angefangen, an sqlHawk zu arbeiten, das darauf abzielt, (Open-Source-) Tools zur Umgehung dieses Problems bereitzustellen.

Es befindet sich derzeit in einem relativ frühen Stadium, unterstützt jedoch bereits das Speichern und Erzwingen von gespeicherten Prozeduren und das Ausführen von skriptbasierten Updates.

Ich wäre dankbar für jede Eingabe von jemandem, der die Zeit hat, sich dieses Tool anzusehen.

Entschuldigung für eklatante Eigenwerbung, aber ich hoffe, das ist für jemanden nützlich!

2
Tim Abell

Wir haben unsere Erstellungs-/Änderungsskripte unter Versionskontrolle. Was die Datenbank selbst anbelangt, wäre es, wenn Sie Hunderte von Tabellen und jede Minute viele Verarbeitungsdaten hätten, ein Mörder für CPU und Festplatte, die gesamte Datenbank zu versionieren. Aus diesem Grund ist Backup meiner Meinung nach immer noch die beste Möglichkeit, Ihre Daten zu kontrollieren.

2
David

Ich stimme vielen Beiträgen zu, die Rubys ActiveRecord-Migrationen betreffen - sie sind eine elegante Möglichkeit, die Datenbank in kleinen inkrementellen Dateien zu verwalten, die jeder freigeben kann. Vor diesem Hintergrund habe ich kürzlich ein Projekt mit VisualStudios Database Project implementiert, und es hat mich ein bisschen zu einem Gläubigen gemacht. Kurzgeschichte - Sie erstellen ein Datenbankprojekt und importieren alle vorhandenen Datenbankobjekte (Tabellen/Ansichten/Trigger/Schlüssel/Benutzer/usw.) in dieses Projekt. Dieser Import führt zu einem "Erstellen" -Skript pro Objekt. Um die Datenbank zu verwalten, ändern Sie das Erstellungsskript und vergleichen beim Bereitstellen von VS die Zieldatenbank mit dem Status der Datenbank, die sich in Ihrem Projekt befindet, und wenden die richtigen alter-Anweisungen an.

Es ist wirklich ein bisschen magisch und ich muss zugeben, es ist eines der besseren Dinge, die das VS-Team getan hat. Ich bin bis jetzt sehr beeindruckt.

Natürlich können Sie das gesamte Datenbankprojekt in einem Versionskontrollsystem Ihrer Wahl verwalten.

2
Bobby B
2
Jeff Moser

In der Regel behalten wir unseren gesamten Objektcode (gespeicherte Prozeduren, Ansichten, Trigger, Funktionen usw.) in der Quellcodeverwaltung, da es sich bei diesen Objekten um Code handelt und wie bei jeder anderen Antwort hier auch, gehört Code in eine Form der Versionskontrolle System.

Für CREATE, DROP, ALTER usw. (DDL) haben wir BuildMaster entwickelt und verwendet, um die Bereitstellung dieser Skripte so zu verwalten, dass sie einmal und nur einmal für eine Zieldatenbank ausgeführt werden können (unabhängig davon, ob sie scheitern oder nicht). Die allgemeine Idee ist, dass Entwickler Änderungsskripten in das System hochladen und wenn es Zeit für die Bereitstellung ist, nur die Änderungsskripten ausgeführt werden, die nicht für die Datenbank der Zielumgebung ausgeführt wurden (dies wird sehr ähnlich verwaltet wie Antwort der Autokratie ). Der Grund für diese Trennung der Skripttypen liegt darin, dass Sie, nachdem Sie die Struktur einer Tabelle bearbeitet, einen Index usw. hinzugefügt haben, dies nicht rückgängig machen können, ohne ein brandneues Skript zu schreiben oder die Datenbank wiederherzustellen - im Gegensatz zum Objektcode, in dem Sie sich befinden Sie können eine Ansicht oder gespeicherte Prozedur einfach löschen und anschließend neu erstellen.

Einige der Vorteile zeigen sich, wenn Sie beispielsweise Ihre Produktionsdatenbank in Ihrer Integrationsumgebung wiederherstellen, das System automatisch genau weiß, welche Skripte nicht ausgeführt wurden, und die Tabellenstruktur dieser neu wiederhergestellten Datenbank hinsichtlich der Aktualität ändert zur Entwicklung.

1
John Rasch

Ich versionskontrolliere das Erstellungsskript und verwende das darin enthaltene svn-Versions-Tag. Wann immer ich dann eine Version bekomme, die verwendet werden soll, erstelle ich ein Skript in einem dbpatches/-Verzeichnis, das als die Version bezeichnet wird, für die ein Rollup durchgeführt werden soll. Die Aufgabe dieses Skripts besteht darin, eine aktuelle Datenbank zu ändern, ohne die Daten zu zerstören. dbpatches/kann beispielsweise Dateien mit den Namen 201, 220 und 240 enthalten. Wenn sich die Datenbank derzeit auf Stufe 201 befindet, wenden Sie zuerst Patch 220 und dann Patch 240 an.

DROP TABLE IF EXISTS `meta`;
CREATE TABLE `meta` (
  `property` varchar(255),
  `value` varchar(255),
  PRIMARY KEY (`property`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `meta` VALUES ('version', '$Rev: 240 $');

Vergessen Sie nicht, Ihren Code zu testen, bevor Sie einen guten Patch in Betracht ziehen. Vorbehalt Emptor!

1
Autocracy

Wir haben einen wöchentlichen SQL-Dump in ein Subversion-Repo. Es ist voll automatisiert, aber es ist eine sehr schwierige Aufgabe.

Sie sollten die Anzahl der Revisionen begrenzen, da dies nach einer Weile wirklich Speicherplatz beansprucht!

1
Oli

Ja natürlich. Wir generieren bei jeder Änderung Speicherauszüge unserer PostgreSQL-Schemas und checken sie ein. Sie haben uns bereits viele Male gerettet, und ich war nur ein paar Monate bei meiner Arbeit.

0
jeffcook2150

Ja, wir haben auch die Quellcodeverwaltung für unsere SQL-Skripte mit Subversion. Dies ist eine bewährte Methode, und Sie können das Schema bei Bedarf mit Standarddaten neu erstellen.

0
Guilherme Melo

Ich verwende ActiveRecord Migrations. Dieses Ruby Juwel kann außerhalb eines Rails Projektes verwendet werden und es gibt Adapter für die meisten Datenbanken, auf die Sie stoßen werden. Mein Tipp: Wenn Sie in der Lage sind Um Ihr Projekt von Postgres auszuführen, erhalten Sie Transaktionsschemamigrationen, dh Sie haben keine kaputte Datenbank, wenn eine Migration nur zur Hälfte zutrifft.

0
jds

Einer der Hauptanwendungsfälle von Kira sind Datenbank-Upgrades, bei denen das Schema außerhalb der Datenbank explizit als Code angegeben wird. Anschließend kann die Datenbank verwaltet und von jeder Version auf eine beliebige Version aktualisiert werden.

0
MathGladiator

Ihr Projektteam kann einen DBA haben, an den jeder Entwickler seine SQL-Anweisungen zum Erstellen, Löschen, Einfügen/Aktualisieren (für Stammdaten) weiterleiten würde. DBAs würden diese Abfragen ausführen und bei erfolgreicher Durchführung des erforderlichen Updates diese Anweisungen einer Textdatei oder einer Kalkulationstabelle hinzufügen. Jeder Zusatz kann als Sicherungspunkt gekennzeichnet werden. Wenn Sie zu einem bestimmten Sicherungspunkt zurückkehren, löschen Sie einfach alle und führen Sie die Abfragen bis zum markierten Sicherungspunkt aus. Dieser Ansatz ist nur ein Gedanke ... eine Feinabstimmung hier würde für Ihre Entwicklungsumgebung funktionieren.

0
user20358

Ein großes Problem, das oft übersehen wird, ist, dass für größere webbasierte Systeme eine Übergangszeit oder ein Bucket-Test-Ansatz erforderlich ist, um neue Releases zu erstellen. Aus diesem Grund ist sowohl ein Rollback als auch ein Mechanismus zur Unterstützung des alten und des neuen Schemas in derselben Datenbank erforderlich. Dies erfordert einen Gerüstansatz (von den Agile DB-Leuten populistisch gemacht). In diesem Szenario kann ein unzureichender Prozess in der DB-Quellcodeverwaltung ein Totalausfall sein. Sie benötigen alte Schemaskripte, neue Schemaskripte und eine Reihe von Zwischenskripten sowie eine Aufräumaktion, sobald das System vollständig auf der neuen Version (oder einem Rollback) ist.

Anstatt Skripte zu haben, um das Schema von Grund auf neu zu erstellen, ist ein zustandsbasierter Ansatz erforderlich, bei dem Sie Skripte lediglich benötigen, um die Datenbank von Version zu Version in den von Ihnen gewünschten Zustand vorwärts und rückwärts zu versetzen. Ihre Datenbank wird zu einer Reihe von Statusskripten, die einfach von der Quelle gesteuert und zusammen mit dem Rest der Quelle markiert werden können.

0
Matt Jenkins

Wir verwalten DDL-Skripte (und manchmal DML-Skripte), die mit unserem ER Tool (PowerAMC) erstellt wurden.

Wir haben eine Reihe von Shell-Skripten, die die Skripten umbenennen, beginnend mit einer Nummer in der Trunk-Verzweigung. Jedes Skript wird festgeschrieben und mit der Bugzilla-Nummer versehen.

Diese Skripte werden dann bei Bedarf zusammen mit dem Anwendungscode in den Release-Zweigen zusammengeführt.

Wir haben eine Tabelle mit den Skripten und deren Status. Jedes Skript wird von dem Bereitstellungstool nacheinander ausgeführt und bei jeder Installation in dieser Tabelle aufgezeichnet.

0
tal

Jeder Datenbankschnittstellencode sollte unbedingt in die Versionskontrolle einbezogen werden (gespeicherte Prozeduren, Funktionen usw.).

Für Struktur und Daten ist es ein Urteilsruf. Ich persönlich behalte eine saubere Strukturvorlage meiner Datenbanken, speichere sie aber aufgrund der Größe nicht in der Versionskontrolle. Das Speichern in der Versionskontrolle kann jedoch sehr nützlich sein, auch wenn Sie nur eine Historie haben.

0
pearcewg

Leider habe ich mehr als ein Team gesehen, das PL/SQL-Programme (gespeicherte Prozeduren in Oracle) - manchmal zehntausende LOC - entwickelt hat, indem es den Code in TOAD (einem Datenbank-Tool) bearbeitet hat, ohne den Quellcode in Dateien zu speichern (mit Ausnahme von Einsatz). Selbst wenn die Datenbank regelmäßig gesichert wird (dies ist jedoch keine Selbstverständlichkeit), besteht die einzige Möglichkeit, eine alte Version einer gespeicherten Prozedur abzurufen, darin, die gesamte Datenbank wiederherzustellen, die viele GB groß ist. Und natürlich führen gleichzeitige Änderungen in einer Datei manchmal zum Verlust von Arbeit, wenn mehr als ein Entwickler an demselben Projekt arbeitet.

0

Ich habe gehört, dass Leute sagen, dass Sie Ihre Schemata unbedingt in der Datenbank behalten müssen. Ich bin mir nicht sicher, ob ich damit einverstanden bin. Dies hängt wirklich von dem System ab, mit dem Sie arbeiten. Wenn Ihr System relativ klein ist und die Daten nicht fürchterlich wichtig sind. Und die Geschwindigkeit, mit der Sie eine andere Entwicklungsumgebung online stellen müssen, ist entscheidend. Dann können Sie davon profitieren. Wenn Ihr Schema jedoch ohne die Daten unbrauchbar ist und die Datenbank extrem groß ist, ist eine "Quellcodeverwaltung" Ihrer Datenbank praktisch nicht mehr möglich. Sicher, Sie können Ihren DDL-Code weiterhin in der Quellcodeverwaltung behalten, aber das ist im Wesentlichen nutzlos. Sie können die benötigten Daten nicht ohne Backup/Restore erhalten.

Bei umfangreicheren Datenbankentwicklungsbemühungen habe ich das Sichern und Wiederherstellen als bevorzugte Rollback-Option ausgewählt. Sicher, Sie können Procs, Views, Funktionen usw. in der Quellcodeverwaltung behalten, aber es ist nicht erforderlich, table.sql zu behalten. Wenn Ihr Bereitstellungsprozess luftdicht ist, müssen Sie Ihre Produktionsumgebung höchstwahrscheinlich nie "zurücksetzen".

0
sam yi

Wir bestehen auf Änderungsskripten und einem Stammdatendefinitionsskript. Diese werden zusammen mit jedem anderen Quellcode in CVS eingecheckt. Das PL/SQL (wo es sich um einen Oracle-Shop handelt) wird auch in CVS von der Quelle gesteuert. Die Änderungsskripte sind wiederholbar und können an alle Teammitglieder weitergegeben werden. Grundsätzlich gibt es, nur weil es sich um eine Datenbank handelt, keine Entschuldigung, sie nicht zu codieren und ein Versionsverwaltungssystem zu verwenden, um die Änderungen zu verfolgen.

0
dacracot

Für Oracle verwende ich das selbstgeschriebene Java programm Oracle-ddl2svn für die automatische Nachverfolgung von Änderungen des Oracle DDL-Schemas in SVN

0
popalka