Geschrieben von: Christoph Wille
Kategorie: Datenbank
This printed page brought to you by AlphaSierraPapa
Im heutigen Artikel beschäftigen wir uns damit, wie man von existierenden Objekten in SQL Server Datenbanken ein Script erstellen kann, das man dann auf einem anderen Server verwenden kann, um idente Objekte zu erstellen (Schema, nicht Daten). Dazu werde ich zwei Wege beschreiben - der interaktive Weg über den Enterprise Manager, als auch wie man es programmatisch erledigen kann.
Die Variante, die jeder Datenbankadministrator sicher schon einmal verwendet hat, ist Generate SQL Scripts. Dazu selektiert man ein Objekt in der Datenbank (in diesem Fall eine Tabelle), klickt mit der rechten Maustaste, und wählt den entsprechenden Befehl im Kontextmenü:
Damit öffnet sich die Dialogbox Generate SQL Scripts. Hier ist standardmäßig nur das zuvor selektierte Objekte gewählt, klickt man allerdings auf Show All kann man alle Tables, Views, Stored Procedures etc. scripten.
Es gibt etliche Formatierungsoptionen für das zu generierende Script. Standardmäßig sollte man sich ein DROP Statement generieren lassen, das allfällig existierende Objekte gleichen Namens (und natürlich Typs) löscht. Da das ein Screenshot für SQL Server 2000 ist, hat man hier zusätzlich die Option, nur SQL 7.0 kompatible Statements generieren zu lassen.
In den Optionen wird es dann so richtig interessant. Hier kann man Roles und Users scripten lassen, die Indexes und Triggers mitscripten (für Tabellen wichtig!), als auch Primärschlüssel und Fremdschlüssel - ebenfalls für Tabellen.
Klickt man nun auf OK, wird man noch nach einem Dateinamen für das Skript gefragt, und schon generiert der Enterprise Manager das SQL Script. Beispielsweise könnte es so aussehen:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Products_Categories]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[Products] DROP CONSTRAINT FK_Products_Categories GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Categories] GO CREATE TABLE [dbo].[Categories] ( [CategoryID] [int] IDENTITY (1, 1) NOT NULL , [CategoryName] [nvarchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Description] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Picture] [image] NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
Dieses Script kann man nun auf einen beliebigen anderen Server transferieren, dort im Query Analyzer öffnen und ausführen - und schon hat man dort eine Tabelle Categories.
Wie generiert der Enterprise Manager dieses Script? Mit Hilfe von Stored Procedures? Weit gefehlt! Es gibt die SQL Distributed Management Objects (SQLDMO), welche die gesamte Palette an Funktionen unterstützen - der Enterprise Manager verpackt diese "nur" in einem netten User Interface. Aber jeder - sogar ASP - kann auf SQLDMO durchgreifen, und Objekte nach Belieben scripten lassen.
Da wir jetzt wissen, wozu SQLDMO genutzt werden kann, schauen wir uns ein Beispiel an, das die Categories Tabelle scriptet. Ich habe die Konstantennamen 1:1 aus der Dokumentation von SQL Server 2000 herausgenommen, damit man leichter danach suchen kann. Die Liste ist natürlich nicht vollständig, soll aber grundsätzlich zeigen, worauf der Enterprise Manager aufsetzt - auf einer Liste simpler Konstanten!
<% Const SQLDMOScript_Drops = 1 Const SQLDMOScript_Default = 4 Const SQLDMOScript_UseQuotedIdentifiers = -1 Const SQLDMOScript_IncludeHeaders = 131072 Const SQLDMOScript_Indexes = 73736 Const SQLDMOScript_Triggers = 16 Const SQLDMOScript_DRI_All = 532676608 ' all of the below Const SQLDMOScript_DRI_AllConstraints = 520093696 Const SQLDMOScript_DRI_ForeignKeys = 134217728 Const SQLDMOScript_DRI_PrimaryKey = 268435456 strFile = Server.MapPath("/sqldmo/demo.sql") Set sql = Server.CreateObject("SQLDMO.SQLServer") sql.LoginSecure = False ' we are not using NTLM sql.LoginTimeout = 5 ' seconds sql.Connect "STRANGELOVE", "sa", "" Set db = sql.Databases("Northwind", "dbo") Set oTable = db.Tables("Categories") nOptions = SQLDMOScript_Drops Or SQLDMOScript_Default strResult = oTable.Script(nOptions, strFile) Response.Write "<PRE>" & strResult & "</PRE>" %>
Das eigentlich Herzstück des Sourcecodes ist die Script Methode. Diese gibt es für (fast) alle Objekte in der SQLDMO Objekthierarchie (Stored Procedures, Views, etc), und erzeugt je nach Konstantenkombination das gewünschte SQL Script - sowohl als Rückgabestring, und optional in eine Datei. In unserem Beispiel generiert der Code das schon bekannte SQL Script:
Wer übrigens zu faul ist, die Konstanten einzutippen, der kann die SQLDMO Type Library einbinden. Zum Beweis, daß es funktioniert, hier der entsprechende Sourcecode - es werden keine DROP Statements generiert, und es wird keine Datei generiert.
<!--METADATA NAME="Microsoft SQLDMO Object Library" TYPE="TypeLib" UUID="{10010001-E260-11CF-AE68-00AA004A34D5}" --> <% Set sql = Server.CreateObject("SQLDMO.SQLServer") sql.LoginSecure = False ' we are not using NTLM sql.LoginTimeout = 5 ' seconds sql.Connect "STRANGELOVE", "sa", "" Set db = sql.Databases("Northwind", "dbo") Set oTable = db.Tables("Categories") nOptions = SQLDMOScript_Default strResult = oTable.Script(nOptions) Response.Write "<PRE>" & strResult & "</PRE>" %>
Ich habe die Script Methode hier anhand des Table Objekts gezeigt. Man kann natürlich so weit gehen, und die gesamte Generate SQL Scripts Dialogbox in ASP nachbauen. Das ist aber dann die Hausaufgabe des Lesers.
Als Abschluß möchte ich noch darauf hinweisen, daß man mit SQLDMO nicht nur SQL Scripts erstellen kann - man kann in ASP fast den gesamten SQL Server Enterprise Manager nachbauen. Wer also ein Feature gerne Web-enabled hätte, der sollte sich mit SQLDMO beschäftigen.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001108.zip
Query Express für MSDE
http:/www.aspheute.com/artikel/20020322.htm
Stored Procedures einfach erstellt
http:/www.aspheute.com/artikel/20020903.htm
SQL Administration over the Web
http://www.asptoday.com/articles/19991123.htm
SQL Server 6.5 Web Manager
http://www.alphasierrapapa.com/IisDev/Articles/SQLAdmin/
The Power of SQL-DMO with ASP
http://www.asptoday.com/articles/19991104.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.