PK/FK Löschen

Boneau

Neuer Benutzer
Beiträge
4
Hallo Zusammen,

da ich mittlerweile etwas verzweifelt bin brauch ich jetzt eure Hilfe.
Und zwar habe ich mir eine SP geschrieben die sämtliche Primary und Foreign Keys löscht.
Das klappt bisher auch ganz gut - allerdings nur wenn ich den Inhalt meiner SP manuell auf eine Datenbank laufen lasse. Da es später aber Automatisiert läut macht das so wenig Sinn.
Vielleicht übersehe ich etwas und Ihr bringt mir die Erleuchtung =)
Hier meine SP:



DECLARE @Database VARCHAR(255)
DECLARE @cmd varchar(1000)
DECLARE @pktablename nvarchar(255)

DECLARE DatabaseCursor CURSOR FOR select name from sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb','distribution','ReportServerTempDB')
--WHERE name IN ('Account_DE')
ORDER BY 1

OPEN DatabaseCursor
FETCH NEXT FROM DatabaseCursor INTO @Database
WHILE @@FETCH_STATUS = 0
BEGIN
--exec sp_dboption @Database, 'db_chaining', 'true'
--exec sp_configure 'Cross DB Ownership Chaining', '1';
-- RECONFIGURE


EXEC ('use '+@Database);


DECLARE TableCursor CURSOR FOR select name from sys.tables ORDER BY 1
DECLARE @tables varchar(max)
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @Tables
WHILE @@FETCH_STATUS = 0
BEGIN
declare @SQL nvarchar(max), @pkname nvarchar(255)
print ''
print @Database + ' -> ' + @tables


DECLARE PKZeug CURSOR FOR (SELECT DISTINCT tc.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE (tc.CONSTRAINT_TYPE = 'Primary Key' OR tc.CONSTRAINT_TYPE = 'Foreign Key') AND tc.TABLE_NAME = Convert(nvarchar(100),@tables))
Open PKZeug
FETCH NEXT FROM PKZeug INTO @pkname
WHILE @@FETCH_STATUS = 0
BEGIN
print ' ALTER TABLE ' + Convert(nvarchar(100),@tables) + ' DROP CONSTRAINT '+Convert(nvarchar(100),@pkname) +';'
select @SQL = 'ALTER TABLE ' + Convert(nvarchar(250),@tables) + ' DROP CONSTRAINT '+Convert(nvarchar(250),@pkname) +';'
EXEC sp_executesql @sql
--print @pkname

FETCH NEXT FROM PKZeug INTO @pkname
end
CLOSE PKZeug
DEALLOCATE PKZeug


FETCH NEXT FROM TableCursor INTO @Tables
end
CLOSE TableCursor
DEALLOCATE TableCursor

FETCH NEXT FROM DatabaseCursor INTO @Database
end
CLOSE DatabaseCursor
DEALLOCATE DatabaseCursor
 
Werbung:
Ich benutze MSSQL um div. Daten zu Anonymisieren und hier muss ich u.a. auch Spalten bearbeiten die einen PK haben. Wenn ich diese dann lösche oder mit einem leerem Zeichen fülle motzt natürlich die Maschine =)
 
Zuletzt bearbeitet:
Ich benutze MSSQL um div. Daten zu Anonymisieren und hier muss ich u.a. auch Spalten bearbeiten die einen PK haben. Wenn ich diese dann lösche oder mit einem leerem Zeichen fülle motzt natürlich die Maschine =)

Dann brauchst doch nur ohne JOIN auf die Tabellen mit dem Klartextkram abzufragen, oder steh ich grad aufm Schlauch?
 
Also was es es eigentlich tun sollte:
Gehe jede DB durch.
Suche wo überall ein PK/FK eingetragen ist.
Baue daraus eine fertige Query und führe sie aus.
Gehe zur nächsten Tabelle.

Das Problem ist, dass es nur die Tabellen und Datenbank durchgeht welche auch ausgewählt/aktiv. Er vermischt quasi meine Auswahl und das was er tun soll auf die aktive DB. Was dann natürlich nicht geht weil es dort diese Tabellen und PKs nicht gibt. =)
Wie bekomme ich es hin, sodass mein Skript auch wirklich auf alle Datenbanken zugreift und auch wirklich benutzt?
Oder gibt es vll eine andere Möglichkeit um alle PK/FK in jeder DB zu löschen?
 
Werbung:
Du hast schon recht es liegt an USE @Database was nicht ausgeführt wird. Ich würde vermuten das USE @Database nur innerhalb von EXEC() abläuft, sobald EXEC ausgeführt und geschlossen wurde befindest du dich wieder in der DB in der du dein Script gestartet hast. Eine Möglichkeit wäre vieleicht vor jede ALTER TABLE Anweisung das USE @Database zu packen und beides zusammen mit EXEC() auszuführen.
 
Zurück
Oben