Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

SQL Server Objekte scripten

Geschrieben von: Christoph Wille
Kategorie: Datenbank

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 Manager

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.

Scripting in ASP mit SQLDMO

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.

Schlußbemerkung

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Query Express für MSDE
Stored Procedures einfach erstellt

Links zu anderen Sites

SQL Administration over the Web
SQL Server 6.5 Web Manager
The Power of SQL-DMO with ASP

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.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.