EMail senden Mail an den Autor Drucken

vorhergehender Eintrag

nächster Eintrag

Inhalt

Hilfe Index

.

Datenbank kopieren

Kopieren der kompletten SQL Datenbank

Dieses Skript hilft dabei, wenn man z.B. eine SQLServer 2000 Datenbank konvertiert hat und dort eben nicht der Schemaname "dbo" ist, sondern "kplus" oder "db_owner" etc.

In diesem Kapitel

Vorgehensweise

Script - Kopieren der SQL Datenbank

vorhergehender Eintrag

nächster Eintrag

Inhalt

Vorgehensweise

Vorgehensweise zum umkopieren der Kplus Datenbank:

  • Alte Datenbank umbenennen
  • Neue Datenbank anlegen (gleich die erforderliche Größe anpassen) mit dem alten Datenbanknamen anlegen, damit Kplus wieder darauf zugreifen kann.
  • Kplus starten - jetzt wird der Datenbank-Admin gestartet und die Tabellen werden dann angelegt. Anschließend wird die Frage kommen, ob die gefundenen Tabellen ausgelagert werden sollen. Dies nicht mehr durchführen.
  • Jetzt das Management-Studio starten und das angefügte Skript öffnen und laut Beschreibung im Skript ändern.
  • Skript ausführen lassen.
  • Fertig!

vorhergehender Eintrag

nächster Eintrag

Inhalt

Script - Kopieren der SQL Datenbank

Script:

-- --------------------------------------------------------------------------------------

-- Umkopieren von userbezogenen Tabellen von einer Datenbank auf eine andere Datenbank

--

-- Programmierer: Widmann Andreas (Juli/2010)

--

-- Erforderliche Skriptanpassungen:

--

-- Es müssen nur die Variablen geändert werden (siehe Beschreibung

-- --------------------------------------------------------------------------------------

-- Umschalten auf die Zieldatenbank

use kplus_M0

GO

-- damit nicht alles ausgegeben wird

SET NOCOUNT ON;

-- Deklaration der benötigten Variablen

DECLARE @l_tbname varchar(200)

,@l_colname varchar(200)

,@l_lasttbname varchar(200)

,@l_cols varchar(4000)

,@l_SQL varchar(8000)

,@l_Source_Owner varchar(100)

,@l_Target_Owner varchar(100)

,@l_Source_DB varchar(100)

,@l_Target_DB varchar(100)

;

-- Setzen (diese 4 Variablen müssen geändert werden!!!)

SET @l_Source_DB = 'kplus_old'; -- alter Datenbankname

SET @l_Target_DB = 'kplus_new'; -- neuer Datenbankname

SET @l_Source_Owner = 'db_owner'; -- Schemaname in alter Datenbank

SET @l_Target_Owner = 'dbo'; -- Schemaname in neuer Datenbank (sollte so bleiben!)

-- --------------------------------------------------------------------------------------

-- ab hier bitte nichts mehr ändern (nur nach vorheriger Rücksprache mit Koram)

-- --------------------------------------------------------------------------------------

-- Erzeugen temporäre Tabelle

-- sicherheitshalber prüfen, ob es diese Tabelle noch gibt

if OBJECT_ID(N'tempdb..#tmpCols') IS NOT NULL

drop table #tmpCols;

-- immer Collate angeben, da man nicht weiß mit welcher Collate die tempdb angelegt wurde

create table #tmpCols (tbname varchar(200) collate Latin1_General_CI_AS, tbcolumns varchar(4000) collate Latin1_General_CI_AS);

-- Selektieren aller Userbezogenen Tabellen mit den dazugehörigen Spalten

DECLARE hCur CURSOR FAST_FORWARD FOR

SELECT sys.objects.name,sys.columns.name

from sys.columns

inner join sys.objects on sys.objects.object_id=sys.columns.object_id

where sys.objects.type='u'

order by 1;

-- Cursor öffnen

OPEN hCur;

-- Lesen

FETCH NEXT FROM hCur INTO

@l_tbname,@l_colname;

SET @l_lasttbname = @l_tbname;

SET @l_cols = '';

-- Schleife über alle Sätze bis EOF

While @@FETCH_STATUS = 0

BEGIN

-- Gruppenwechsel feststellen

IF @l_lasttbname <> @l_tbname

BEGIN

-- Einfügen in die temp. Tabelle

INSERT INTO #tmpCols VALUES(@l_lasttbname,@l_cols);

SET @l_lasttbname = @l_tbname;

SET @l_cols = '';

END

-- Spalten zusammenbauen

IF @l_cols <> ''

SET @l_cols = @l_cols + ',';

SET @l_cols = @l_cols + @l_colname;

-- weiterlesen

FETCH NEXT FROM hCur INTO

@l_tbname,@l_colname;

END

-- Letzte Tabelle gehört auch noch in die temp. Tabelle

INSERT INTO #tmpCols VALUES(@l_lasttbname,@l_cols);

-- Cursor schliessen

CLOSE hCur;

DEALLOCATE hCur;

-- Selektieren der gerade aufgebauten temp. Tabelle

DECLARE hCur CURSOR FAST_FORWARD FOR

SELECT tbname,tbcolumns

from #tmpCols

order by tbname;

OPEN hCur;

-- Lesen

FETCH NEXT FROM hCur INTO

@l_tbname,@l_cols;

-- Schleife über alle Sätze bis EOF

While @@FETCH_STATUS = 0

BEGIN

-- Löschen Zieltabelle

SET @l_SQL = 'DELETE FROM ' + @l_Target_DB + '.' + @l_Target_Owner + '.' + @l_tbname;

EXEC (@l_SQL);

-- Setzen Identity-Insert

SET @l_SQL = 'SET IDENTITY_INSERT ' + @l_tbname + ' ON' + CHAR(13) + CHAR(10);

-- Datensätze kopieren mittels INSERT + SELECT

SET @l_SQL = @l_SQL + 'INSERT INTO ' + @l_Target_DB + '.' + @l_Target_Owner + '.' + @l_tbname + '(' + @l_cols + ') ';

SET @l_SQL = @l_SQL + 'SELECT ' + @l_cols + ' FROM ' + @l_Source_DB + '.' + @l_Source_Owner + '.' + @l_tbname;

-- Ausgabe des SQL-Befehles, damit man bei einem Fehler weiß, wo dieser passiert ist.

PRINT @l_SQL;

EXEC (@l_SQL);

-- weiterlesen

FETCH NEXT FROM hCur INTO

@l_tbname,@l_cols;

END

CLOSE hCur;

DEALLOCATE hCur;

GO

vorhergehender Eintrag

nächster Eintrag

Inhalt

SQL Scripts

Zum Seitenanfang Drucken