SQL Server Objekte scripten
Geschrieben von: Christoph Wille 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. Scripting im Enterprise ManagerDie 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. Scripting in ASP mit SQLDMODa 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. SchlußbemerkungAls 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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Query Express für MSDE Links zu anderen Sites
SQL Administration over the Web Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |