Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Skrypt SQL do zmiany WSZYSTKICH kluczy obcych, aby dodać ON DELETE CASCADE

Oto skrypt, którego użyłem w podobnym celu. Nie obsługuje złożonych kluczy obcych (które używają więcej niż jednego pola). I prawdopodobnie wymagałoby pewnych poprawek, zanim zadziała w twojej sytuacji. EDYCJA:W szczególności nie obsługuje poprawnie wielokolumnowych kluczy obcych.

select
  DropStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema + 
      '].[' + ForeignKeys.ForeignTableName + 
      '] DROP CONSTRAINT [' + ForeignKeys.ForeignKeyName + ']; '
,  CreateStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema + 
      '].[' + ForeignKeys.ForeignTableName + 
      '] WITH CHECK ADD CONSTRAINT [' +  ForeignKeys.ForeignKeyName + 
      '] FOREIGN KEY([' + ForeignKeys.ForeignTableColumn + 
      ']) REFERENCES [' + schema_name(sys.objects.schema_id) + '].[' +
  sys.objects.[name] + ']([' +
  sys.columns.[name] + ']) ON DELETE CASCADE; '
 from sys.objects
  inner join sys.columns
    on (sys.columns.[object_id] = sys.objects.[object_id])
  inner join (
    select sys.foreign_keys.[name] as ForeignKeyName
     ,schema_name(sys.objects.schema_id) as ForeignTableSchema
     ,sys.objects.[name] as ForeignTableName
     ,sys.columns.[name]  as ForeignTableColumn
     ,sys.foreign_keys.referenced_object_id as referenced_object_id
     ,sys.foreign_key_columns.referenced_column_id as referenced_column_id
     from sys.foreign_keys
      inner join sys.foreign_key_columns
        on (sys.foreign_key_columns.constraint_object_id
          = sys.foreign_keys.[object_id])
      inner join sys.objects
        on (sys.objects.[object_id]
          = sys.foreign_keys.parent_object_id)
        inner join sys.columns
          on (sys.columns.[object_id]
            = sys.objects.[object_id])
           and (sys.columns.column_id
            = sys.foreign_key_columns.parent_column_id)
    ) ForeignKeys
    on (ForeignKeys.referenced_object_id = sys.objects.[object_id])
     and (ForeignKeys.referenced_column_id = sys.columns.column_id)
 where (sys.objects.[type] = 'U')
  and (sys.objects.[name] not in ('sysdiagrams'))


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy można używać agregatów zdefiniowanych przez użytkownika (clr) z funkcjami okna (over)?

  2. Sprawdź zmiany we wszystkich innych kolumnach na podstawie podobieństw w jednej kolumnie

  3. Jak wybrać ostatnie 5 wierszy w tabeli bez sortowania?

  4. t-sql select pobierz wszystkie miesiące w zakresie lat

  5. Po co wstawiać blok instrukcji TSQL, gdy poziom izolacji transakcji dla innej transakcji można serializować z filtrem nie powodującym konfliktów?