Cela vous permettra de supprimer une contrainte de clé étrangère spécifique basée sur le nom tablename + colonne
Après avoir essayé les autres réponses que je viens d'avoir un coup de coude autour des tables système jusqu'à ce que je trouve quelque chose regarder probablement.
celui que vous voulez est constraint_column_usage qui, selon les docs Returns one row for each column in the current database that has a constraint defined on the column.
Je l'ai rejoint à sys.objects pour obtenir juste les clés étrangères.
Dans une procédure (ce qui emprunte les autres réponses acclamations gars.!):
Create Proc yourSchema.dropFK(@SchemaName NVarChar(128), @TableName NVarChar(128), @ColumnName NVarChar(128))
as
Begin
DECLARE @ConstraintName nvarchar(128)
SET @ConstraintName = (
select c.Constraint_Name
from Information_Schema.Constraint_Column_usage c
left join sys.objects o
on o.name = c.Constraint_Name
where c.TABLE_SCHEMA = @SchemaName and
c.Table_name = @TableName and
c.Column_Name = @ColumnName and
o.type = 'F'
)
exec ('alter table [' + @SchemaName + '].[' + @TableName + '] drop constraint [' + @ConstraintName + ']')
End
Vous pouvez utiliser la tactique ci-dessus avec sp_rename et de rendre les noms plus lisibles si vous voulez le faire plutôt que il suffit de les laisser tomber. –
Existe-t-il un moyen d'éviter de supprimer toutes les contraintes non nommées de la table? Par exemple: "dropFK 'Machines', 'IdArticle', 'Articles'", où IdArticle est le PK et Articles est la table référencée? – nano
Certes, vous avez juste besoin de creuser un peu plus profond dans les tables système, restreignant cela pourrait être accompli en se joignant à sysforeignkeys – cmsjr