Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

PK/FK Löschen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Boneau, 8 Juli 2014.

  1. Boneau

    Boneau Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ich frage mich, was das generell für einen Sinn macht? Kann man ja gleich MySQL nehmen.
     
  3. Boneau

    Boneau Neuer Benutzer

    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: 8 Juli 2014
  4. akretschmer

    akretschmer Datenbank-Guru

    Dann brauchst doch nur ohne JOIN auf die Tabellen mit dem Klartextkram abzufragen, oder steh ich grad aufm Schlauch?
     
  5. Boneau

    Boneau Neuer Benutzer

    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?
     
  6. Boneau

    Boneau Neuer Benutzer

    habs jetzt mit powershell gelöst
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden