DB via SMO klonen

1 reply [Letzter Beitrag]
HenryKM
Offline
Joined: 15.12.2009
Beiträge:

Hallo erst mal.

Ich hoffe, ich poste im richtigen Bereich. Wenn nicht, möge man mir das für mein erstes Mal bitte verzeihen.

Ich versuche, mittels Scripter und DependencyCollection Scripte erstellen zu lassen, welche mit eine Datenbank klonen.

Grundsätzlich läuft es schon nicht schlecht: Nur ärgert mich eine Eigenheit, welche ich nicht gelöst bekomme.

Befindet sich in meiner Source - Datenbank ein Constraint ähnlich "DF__CONF_MACH__PROGR__371114F6" so wird diese Kennung im generierten Script ignoriert. Der Constraint wird zwar angelegt - hat aber eine völlig andere Kennung. Sobald ich versuche, darauf zuzugreifen, funktionieren die Scripte nicht mehr.

Beispiel (generiertes Script):


IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF__CONF_MACH__PROGR__371114F6]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[CONF_MACHINE] ADD DEFAULT ((-1)) FOR [PROGRAM_DW]
END

Hier wird versucht, den Default zu setzen obwohl für dieses Feld schon ein Default vorhanden ist.

In der neuen Datenbank lautet der Name für den Constraint z.B.: "DF__CONF_MACH__PROGR__7E8CC4B1"

Der Source, mit welchem ich die Scripte erstellen lasse, kommt nachfolgend:


Scripter scpScripter = new Scripter(m_srv);
DependencyTree dtDepTree =
scpScripter.DiscoverDependencies(new SqlSmoObject[] { m_srv.Databases[m_strDBNameSrc].Views[m_strObjName] }, DependencyType.Parents);
DependencyCollection dcDepColl = scpScripter.WalkDependencies(dtDepTree);
scpScripter.Options.DriAllConstraints = true;
scpScripter.Options.DriAllKeys = true;
scpScripter.Options.DriIndexes = true;
scpScripter.Options.ScriptDrops = false;
scpScripter.Options.ContinueScriptingOnError = true;
scpScripter.Options.Default = true;
scpScripter.Options.DriAll = true;
scpScripter.Options.IncludeIfNotExists = true;
scpScripter.Options.WithDependencies = true;
StringCollection sclScript = scpScripter.ScriptWithList(dcDepColl);
m_srv.Databases[m_strDBNameDst].ExecuteNonQuery(sclScript);

Kann mir jemand sagen, was ich noch verkehrt mache? Die Tests laufen auf einem SQL 2008 Server.

Herzlichen Dank.

Gruß

Henry

Noch keine Bewertungen
admin
Offline
Joined: 19.12.2007
Beiträge:

Der eigentliche "Fehler", den Du machst ist, dass Du es dem SQL Server überlasst, Namen für die Constraints zu vergeben. Namen wie "...371114F6" generiert der SQL Server, wenn Du keinen eigenen Namen für Objekte vergibst. Da diese Namen also demzufolge "system-generiert" sind, musst Du die entsprechende Option in Deinem Code einfügen:

scpScripter.Options.DriIncludeSystemNames = true;

Dann sollte Dein Script auch folgendermassen aussehen:

ALTER TABLE [dbo].[CONF_MACHINE] ADD CONSTRAINT [DF__CONF_MACH__PROGR__371114F6] DEFAULT ((-1)) FOR [PROGRAM_DW]

Ich würde aber empfehlen, nichts dem Server zu überlassen, auf was Du selbst Einfluss nehmen kannst. Wenn Du selber die Constraints benennst, kommt Du erst gar nicht in diese Probleme.