Hallo Team,
Ich muss Datensätze innerhalb einer Tabelle kopieren und verzweifele.
Bitte lest erst zuende, bevor Ihr standart Antworten gebt. Ich habe schon viele Lösungsversuche gelesen, die aber alle nichts brachten.
zunächst einmal die Situation:
MS SQL2000 auf Windows 2003 maximaler Patchstand März 2008 ENU
Die Datenbank speißt ein ASP-Web unter IIS6 mit Daten.
Nun die Lasten:
Berechtigungen werden ausschließlich auf den Stored Procedures vergeben.
Nur Entwickler und eine kleine Gruppe von Reportingleuten dürfen an die Tabellen per Insert/Select und Update.
Die Stammdatentabelle wird variabel an die Aufgaben angepasst. Je nach Kunde können neue Felder hinzukommen oder -bei wegfall des Kunden; wieder verschwinden.
Ein Datensatz umfasst etwa 250 Eigenschaften, welche in etwa 10 Haupt- und 40 referenztabellen zusammengefasst sind.
Es gibt auf der einen Seite die Möglichkeit, einen Datensatz von grund auf neu anzulegen. Das macht aber selten Sinn.
Meistens wird ein beliebiger Datensatz als Template verwendet und die abweichenden Daten dann angepasst.
Nun die Aufgabe an der ich im augenblick scheitere:
Ich muss eine Stored procedure schreiben, welche einen beliebigen Datensatz kopiert, ohne dabei auf einen statischen Select-befehl mit einer Spaltenliste zurückzugreifen.
Hier mein bisheriger Ansatz, der allerdings immer noch rechte auf der Tabelle benötigt:
Wie ihr seht, baue ich ein insert-select-statement auf, welches die Spaltenliste dynamisch erstellt.
Leider baut der EXEC-Befehl nicht auf der ACL der Procedure auf, sondern will auf der Tabelle die Rechte haben -was nach Lastenbeschreibung nicht erlaubt ist.
Ein zweiter Ansatz war das hier:
Hier war die Idee den select in eine SP einzupacken. Problem jetzt ist, das ich dem Benutzer kein ALTER Procedure-Recht auf eine SP geben kann.
Ein weiterer Lösungsansatz, welcher mir im Kopf schwebt, ob ich in einer SP einen eigenen Benutzer aufrufen -sozusagen ein eigenes login; kann?
Gibt es noch einen Befehl, welchen ich übersehe?
Welche Vorschläge habt Ihr?
Danke und Gruss
carsten
Ich muss Datensätze innerhalb einer Tabelle kopieren und verzweifele.
Bitte lest erst zuende, bevor Ihr standart Antworten gebt. Ich habe schon viele Lösungsversuche gelesen, die aber alle nichts brachten.
zunächst einmal die Situation:
MS SQL2000 auf Windows 2003 maximaler Patchstand März 2008 ENU
Die Datenbank speißt ein ASP-Web unter IIS6 mit Daten.
Nun die Lasten:
Berechtigungen werden ausschließlich auf den Stored Procedures vergeben.
Nur Entwickler und eine kleine Gruppe von Reportingleuten dürfen an die Tabellen per Insert/Select und Update.
Die Stammdatentabelle wird variabel an die Aufgaben angepasst. Je nach Kunde können neue Felder hinzukommen oder -bei wegfall des Kunden; wieder verschwinden.
Ein Datensatz umfasst etwa 250 Eigenschaften, welche in etwa 10 Haupt- und 40 referenztabellen zusammengefasst sind.
Es gibt auf der einen Seite die Möglichkeit, einen Datensatz von grund auf neu anzulegen. Das macht aber selten Sinn.
Meistens wird ein beliebiger Datensatz als Template verwendet und die abweichenden Daten dann angepasst.
Nun die Aufgabe an der ich im augenblick scheitere:
Ich muss eine Stored procedure schreiben, welche einen beliebigen Datensatz kopiert, ohne dabei auf einen statischen Select-befehl mit einer Spaltenliste zurückzugreifen.
Hier mein bisheriger Ansatz, der allerdings immer noch rechte auf der Tabelle benötigt:
Code:
set @table='[TabellemitDaten]' declare mycur cursor for select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @table order by ORDINAL_POSITION OPEN mycur --jump ID (recordidentifier) FETCH NEXT FROM mycur INTO @strFieldDef --jump servername (first changingfield) FETCH NEXT FROM mycur INTO @strFieldDef --get first valid field FETCH NEXT FROM mycur INTO @strFieldDef set @strSQL='insert into [' + @table + '] select ' +char(39) + @newserver +char(39)+ ' as ServerName, ' + @strFieldDef FETCH NEXT FROM mycur INTO @strFieldDef WHILE (@@FETCH_STATUS = 0) BEGIN SET @strSQL = @strSQL + ', [' + @strFieldDef + ']' FETCH NEXT FROM mycur INTO @strFieldDef END SET @strSQL = @strSQL + ' from [' + @table + '] where servername=' +char(39)+ @oldserver+char(39) CLOSE mycur deallocate mycur exec(@strSQL) select @newsid=@@identity
Leider baut der EXEC-Befehl nicht auf der ACL der Procedure auf, sondern will auf der Tabelle die Rechte haben -was nach Lastenbeschreibung nicht erlaubt ist.
Ein zweiter Ansatz war das hier:
Code:
..... SET @strSQL = @strSQL + ' from [' + @table + '] where servername=' +char(39)+ @oldserver+char(39) CLOSE mycur deallocate mycur set @strSQL='alter procedure web_function_copyserver_sub as ' + @strSQL + ' return @@identity' exec(@strSQL) exec @newsid=web_function_copyserver_sub
Ein weiterer Lösungsansatz, welcher mir im Kopf schwebt, ob ich in einer SP einen eigenen Benutzer aufrufen -sozusagen ein eigenes login; kann?
Gibt es noch einen Befehl, welchen ich übersehe?
Welche Vorschläge habt Ihr?
Danke und Gruss
carsten
Comment