Fragensteller
Sicht duplizieren

Allgemeine Diskussion
-
Hallo Zusammen,
ich möchte gerne eine Sicht, so wie sie gerade ist, sichern, verändern und danach wieder so herstellen wie sie vor der Veränderung war.
Der einfachste Weg der mir einfällt ist, die Sicht vorher unter einem neuen Namen (bspw. meineSicht_tmp) zu speichern. Geht das? Wenn ja wie?
Oder gibt es bessere Methoden um die Sicht zu sichern? Kann ich bspw. den Code der Sicht auslesen und in eine Variable speichern? (Ich nutze Access und VBA)
Vielen Dank und viele Grüße
Patrick
- Typ geändert Ionut DumaModerator Dienstag, 4. Februar 2014 15:36 Keine Rueckmeldung des Fragenstellender
Alle Antworten
-
Hallo Patrick,
mir ist nicht ganz klar was Du möchtest. Wenn Du mit
SELECT * FROM myview
eine View aufrufst hast Du ein temporäres Ergebnis, Selbstverständlich kannst Du das Resultset speichern, verändern. Dies alles ohne das das SQL-Statement der View in irgend einer Weise hiervon beeinflusst wird.
Ich will gar nicht fragen, warum man zur Laufzeit eine View ändern will/muss. Ich halte dies für bedenklich.
Den Befehl zum Erstellen einer View kannst Du mit
EXEC sp_helptext 'myview'
abfragen.
das funktioniert aber, meines Wissens, nur wenn die View nicht mit "WITH ENCRYPTION" erstellt wurde.
Da Du mit dieser Abfrage den kompletten Befehl 'CREATE VIEW myview AS ............' erhälst bietet sich an, mit
DROP myview
die View in der derzeitigen Variante zu löschen und anschliessend den entsprechenden 'CREATE VIEW ..' zum anlegen der View dem SQL-Server zu übergeben.
Gruss Uli
-
Was mir in Uli's Vorschlag fehlt, ist der Hinweis, das man den gescripteten Erstellungsbefehl ja leicht ändern kann, und aus dem "CREATE VIEW OriginalName..." ein "CREATE VIEW NeuerName..." machen kann
im Management Studio kommt man da übrigens leicht mit Rechtslick auf die Sicht "Erzeuge Skript für "Create" heran (oder so ähnlich, hab hier kein deutsches SSMS, sorry)
Und dann eben den Namen ändern und NICHT die alte Droppen
Andreas Wolter
Microsoft Certified Master SQL Server 2008
Microsoft Certified Solutions Master SQL Data Platform, SQL Server 2012
Blog: www.insidesql.org/blogs/andreaswolter
Web: www.andreas-wolter.com | www.SarpedonQualityLab.com -
Ich mache das ganze aus Access (eine adp) heraus. Programmiere also mit VBA. Ich kann das also nicht im Managementstudio durch klicken tun, sondern muss es in der Tat zur Laufzeit machen.
Die Sache ist, dass eine komplexe Reportstruktur auf eine bestimmte View basiert. Um das Ergebnis der Reports zu verändern will ich kurzzeitig die Baisview einschränken. Danach, wenn mein bericht erstellt ist, will ich wieder die ursprüngliche View haben.
Ich kenn aber zur Laufzeit leider nicht den Inhalt der ursprünglichen View. Daher müsste ich diesen erst auslesen und irgendwo sichern.
Ein neuer Select auf die bestehende View geht auch nicht, weil der Name der ursprünglichen View vielfach in den Reports benutzt wird. ich kann also keine Sicht mit einem neuen Namen erstellen.
Ich muss also irgendwie das Statement der ursprünglichen View auslesen und zwischenspeichern. Oder aber die View kurzzeitig unter einen neuen Namen duplizieren.
-
Ach das war der Haken, verstehe.
Hm, architektonisch klingt das nicht ideal. Wenn Du auf Prozeduren setzen könntest, wäre das alles kein Akt. Aber ich schätz, das ist nun zu spät.
Was genau musst Du denn ändern?
Eine WHERE-Bedingung?
Spalten austauschen? Namen ändern? Spalten hinzufügen&ändern? - Ich hoffe das alles nicht.
Wenn es "nur" eine Filteranweisung ist, sollte Uli's Vorschlag mit dem Ausscripten der Definition funktionieren, ohne das irgendetwas dann ins leere verweist.
Ansonsten kann man solche Filter ja meist auch in Berichten selber integrieren (ohne die Basis-Objekte zu editieren) - aber da kenne ich mich in Access nicht mehr aus.
Andreas Wolter
Microsoft Certified Master SQL Server 2008
Microsoft Certified Solutions Master SQL Data Platform, SQL Server 2012
Blog: www.insidesql.org/blogs/andreaswolter
Web: www.andreas-wolter.com | www.SarpedonQualityLab.com -
Ja genau.. leider zu spät. Wenn ich das auf der grünen Wiese tun könnte, würde ich das natürlich anders machen.
Ich muss nur die WHERE Bedingung ändern.
Das mit dem ausscripten klappt tatsächlich. Also ich sehe im Management Studio das ganze Statement der View. Nur ist mein SQL Wissen zu dünn um zu wissen wie ich dieses Ergebnis in meine CREATE VIEW Anweisung integrieren kann.
Habt Ihr bitte noch einen Tipp für mich?
-
Schau doch mal, was hier passiert:
USE tempdb GO create view v1
as
select name from sys.objects
go
exec sp_helptext 'v1'
GO
-- ändern
ALTER view v1
as
select name from sys.objects
where name = 'v1'
go
-- aufräumen
drop v1
Damit wird eine Sicht "v1" angelegt
Danach kommt die Anzeige des Scriptes
und am Ende wird sie wieder gelöscht - das gehört aber nicht zur Demo sondern ist nur Aufräumarbeit
Entscheidend ist der Script, der Dir unten im Ergebnis angezeit wird. Diesen kannst Du sicher mit VBA einlesen und manipulieren.
Du würdest also in dem Text die Stelle suchen, wo die WHERE-Bedingung hingehört, und die Sicht temporär mit Deiner Version ersetzen, indem Du die bestehende mit ALTER änderst. - Beispiel siehst Du da.
-Möglichst nicht einfach löschen und Neu anlegen - damit würdet ihr alle Berechtigungen, die ev. direkt auf der Sicht liegen, verlieren, und auch mit Repliakation würde sich das nicht vertragen.
Du würdest dann das ganze wieder umdrehen, die alte Version wieder "hervorholen" und mit ALTER "zurücküberschreiben".
Ich hoffe das ist verständlich ausgedrückt.
Andreas Wolter
Microsoft Certified Master SQL Server 2008
Microsoft Certified Solutions Master SQL Data Platform, SQL Server 2012
Blog: www.insidesql.org/blogs/andreaswolter
Web: www.andreas-wolter.com | www.SarpedonQualityLab.com -
Hallo Patrick,
Hat Dir die Antwort von Andreas geholfen?
Gruss,
Ionut
Ionut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
**************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
**************************************************************************************************Ionut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.