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

Werte in gleichnamigen Spalten in verschiedenen Tabellen löschen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von MyCodeBucket, 30 Juli 2019.

  1. MyCodeBucket

    MyCodeBucket Neuer Benutzer

    Hallo zusammen.

    Ich stehe vor folgendem Problem:

    Auf einem MS SQL 2014 soll der Inhalt von zwei Spalten (attrib1,attrib3) in verschiedenen Tabellen gelöscht/überschrieben werden. die Tabellen identifiziere ich wie folgt:

    SELECT TABLE_NAME, COLUMN_NAME
    FROM database.INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = 'attr1'
    ORDER BY TABLE_NAME
    SELECT TABLE_NAME, COLUMN_NAME
    FROM database.INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = 'attr3'
    ORDER BY TABLE_NAME


    Diese Tabellen starten stets mit folgenden Zeichen: zTM...

    Um die Einträge in den Spalten 'attrib1' und 'attrib3' zu "anonymisieren" (hierbei handelt es sich um Benutzerdaten ...created by und last changed by...) verwende ich manuell für alle Tabellen folgende Statements:

    UPDATE [database].[dbo].[zTM...] SET attr1 ='ANON'
    UPDATE [database].[dbo].[zTM...] SET attr3 ='ANON'


    So weit zu meinem "überragenden" rudimentären Wissen zu SQL, anspruchsvoller kann ich nicht ;)

    Ich würde das Ganze gerne in einem SQL Statement ausführen und als StoredProcedure vorhalten.

    Das Problem ist, dass zu den Tabellen stets neue hinzukommen können und ich somit die "Identifikation" aller Tabellen mit den betreffenden Spalten durchführen muss.

    Bin ich da von meinem Ansatz her schräg oder gibt es eine einface Lösung?

    Ich möchte in den Tabellen die Werte einfach gelöscht oder mit einem Standardwert befüllt haben.

    Kann man evt. einen Trigger basteln, der die Ändeung in den Spalten erkennt und dann den Wert automatisch löscht oder umschreibt?

    Da eine Java Applikation in die Datenbank schreibt traue ich mich nicht, die Spalten einfach auf 'read only' zu setzen, da ich nicht weiss wie die Applikation beim schreiben reagiert.

    Hat jemand eine Idee, wie ich das umsetzen kann? Für eure Hilfe wäre ich dankbar, ich hab keine Ahnung von SQL, würde auch die Finger davon lassen, oder es eben lernen, aber dazu fehlt mir aktuell die Zeit.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    das klingt alles extrem abenteuerlich. Warum speichert ihr erst die Daten, wenn ihr sie nicht benötigt?

    Zum Kern Deiner Frage: aus den Katalogen kannst Du die Namen der Tabellen holen, ja. Daraus mußt Du dann aber dynamisch die SQL-Befehle generieren, und diese generierten Befehle ausführen. Für PostgreSQL ginge das so: PostgreSQL: Documentation: 11: 43.5. Basic Statements

    Ein Trigger, der beim Insert/Update die Spalten vor der Speicherung noch einmal überschreibt, ist auch denkbar - und aus Datenschutzsicht sogar besser. Ich bin aber kein MSSQL-Experte.
     
  3. MyCodeBucket

    MyCodeBucket Neuer Benutzer

    Tja, wenn ich die Daten erst gar nicht speichern müsste, wäre ich froh, aber die kommen eben aus einer Applikation als Dokumenteigenschaften mit und in der Applikation kann ich aus Gewähleistungsgründen nichts ändern, geschweige denn dass ich nicht im Source-Code rumbasteln würde.
    Danke für den PostgeS link :)
    Die Trigger-Lösung finde ich auch charmanter.
    Wie gesagt, weiter wie die Basic-Basic-Basics habe ich bei SQL nie gebraucht. (sprich SELECT und UPDATE) :p
     
  4. akretschmer

    akretschmer Datenbank-Guru

    mal als Demo:

    Code:
    test=*# create table foo(id int primary key, val1 text, val2 text, val3 text);
    CREATE TABLE
    test=*# create or replace function trg_foo() returns trigger as $$begin new.val2:='anon'; new.val3:='anon';return new; end;$$language plpgsql;
    CREATE FUNCTION
    test=*# create trigger trg1 before insert or update on foo for each row execute procedure trg_foo();
    CREATE TRIGGER
    test=*# select * from foo;
     id | val1 | val2 | val3
    ----+------+------+------
    (0 rows)
    
    test=*# insert into foo values (1, 'name1', 'geheim spalte val2', 'geheim spalte val3');
    INSERT 0 1
    test=*# select * from foo;
     id | val1  | val2 | val3
    ----+-------+------+------
      1 | name1 | anon | anon
    (1 row)
    
    test=*# update foo set val2 = 'geheim2', val3='geheim3' where id = 1;
    UPDATE 1
    test=*# select * from foo;
     id | val1  | val2 | val3
    ----+-------+------+------
      1 | name1 | anon | anon
    (1 row)
    
    test=*#
    
    PostgreSQL, in M$SQL kann und wird die Syntax anders sein.
     
  5. MyCodeBucket

    MyCodeBucket Neuer Benutzer

    SUPER! Vielen Dank.
    Genauso schauts perfekt aus.
    Jetzt muss ich das "NUR" noch passend umsetzen und einbauen :confused::D XD
    Ich halt dich auf dem laufenden (und beschäftige mich mit Triggern und StoredPrcedures)
    Danke für den Ansatz :)
     
    akretschmer gefällt das.
  6. MyCodeBucket

    MyCodeBucket Neuer Benutzer

    ...und wenn ichs nicht hinbekomm tausch ich einfach den MS SQL Server gegen nen Postgres Server um :p
    Kleiner Scherz
     
    akretschmer gefällt das.
  7. akretschmer

    akretschmer Datenbank-Guru

    Damit wärest Du weder der Erste noch der Letzte...
     
  8. ukulele

    ukulele Datenbank-Guru

    Unter MSSQL würde sich da ein INSTEAD OF-Trigger anbieten, leider unterscheiden sich die SQL-Varianten grade bei Triggern sehr stark. Hier mal ein Beispiel:
    Code:
    CREATE TRIGGER   [dbo].[unt_insert]
       ON           [dbo].[unt]
       INSTEAD OF INSERT, UPDATE
    AS
    BEGIN
       SET NOCOUNT ON;
    
       INSERT INTO unt(pk,id)
       SELECT   i.pk,
               NULL
       FROM   INSERTED i
       LEFT JOIN DELETED d
       ON       i.pk = d.pk
       WHERE   d.pk IS NULL
    
       UPDATE   unt
       SET       unt.pk = i.pk,
               unt.id = NULL
       FROM   unt
       INNER JOIN INSERTED i
       ON       unt.pk = i.pk
       INNER JOIN DELETED d
       ON       unt.pk = d.pk
    END
    GO
    Das ist eine Tabelle von mir namens "unt". Mit diesem Trigger würde die Spalte "pk" ganz regulär eingefügt oder aktuallisiert, alle Spalten müssten im Prinzip im INSERT und UPDATE-Statement so auftauchen. Nur die Spalte deren Daten du verwerfen willst (in diesem Falle wäre das "id") setzt du in beiden Vorgängen auf NULL. Jetzt kann jeder in die DB inserten was er will, diese Spalte wird nie befüllt werden.

    Großer Nachteil von dem Trigger ist natürlich, dass wenn sich die Tabelle ändert, auch der Trigger angepasst werden muss. Vorteil ist aber das, selbst wenn andere Trigger auf der Tabelle arbeiten, die Daten zu keinem Zeitpunkt in die DB geschrieben werden, also auch nicht von einem anderen Trigger, der erst nach dem eigentlichen Insert feuert, irgendwie ausgelesen werden.
     
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