2016-03-29 28 views
2

Adını belirtmeden bir yabancı anahtar oluşturdum, böylece sql sunucusu otomatik oluşturulan adla oluşturdu. Şimdi bu yabancı anahtarı olan sütunu bırakmak istiyorum. Sorun şu ki bu yabancı anahtarın adını bilmiyorum. Belirli bir tablonun tüm yabancı anahtarlarını belirli bir tabloya bırakmanın bir yolu var mı?Belirli bir sütunun yabancı anahtarları nasıl açılır

Şimdiye kadar sütuna

DECLARE @tableName VARCHAR(MAX) 
DECLARE @ConstraintName nvarchar(200) 
DECLARE @columnName VARCHAR(MAX) 

SET @tableName = 'tablename' 
SET @columnName = 'columnname' 
SELECT @ConstraintName = Name 
FROM SYS.DEFAULT_CONSTRAINTS 
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) 
AND PARENT_COLUMN_ID = (
    SELECT column_id FROM sys.columns 
    WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName)) 
IF @ConstraintName IS NOT NULL 
    BEGIN 
EXEC('ALTER TABLE '[email protected]+' DROP CONSTRAINT ' + @ConstraintName) 
END 

ALTER TABLE [tablename] DROP COLUMN columnname 
GO 

için tüm varsayılan kısıtlamaları düşer bu senaryoyu buldum Ama yabancı anahtar kısıtlamaları ile yardımcı olmuyor.

+1

'EXEC sp_help 'TABLE_NAME';' Sonuç kümesinden FK kısıtlama adını kopyalayın ve ardından 'DROP CONSTRAINT' komutunu kullanarak bırakın! –

cevap

3

FK hakkında ve özellikle kullanabileceğinizden daha özel bir plan ve tablo hakkında daha fazla bilgi almak isterseniz. Yalnızca belirli sütun hakkında ilgileniyorsanız

SELECT 
    t.Name as TableName, 
    c.name as ColumnName, 
    fk.name as FK_NAME 

FROM sys.foreign_keys as fk 
inner join sys.tables as t on fk.parent_object_id = t.object_id 
inner join sys.columns as c on c.object_id = t.object_id 
inner join sys.schemas as sc on t.schema_id = sc.schema_id 
WHERE sc.name = 'Schema' and t.name = 'Table' and c.name = 'Column' 

sonra u Ross Baskı cevap kullanabilirsiniz.

Declare @sql nvarchar(4000) 
    SET @sql = N''; 

    SELECT @sql = @sql + ' 
    ALTER TABLE [' + sc.NAME + '].[' + OBJECT_NAME(fk.parent_object_id) + ']' + ' DROP CONSTRAINT ' + '[' + fk.NAME + '] 
    ' 
    FROM sys.foreign_keys as fk 
    inner join sys.tables as t on fk.parent_object_id = t.object_id 
    inner join sys.columns as c on c.object_id = t.object_id 
    inner join sys.schemas as sc on t.schema_id = sc.schema_id 
    WHERE sc.name = 'schemaName' and c.name = 'columnName' -- you can include and fk name 
    ORDER BY fk.NAME 
    PRINT @sql; 
--EXEC sys.sp_executesql @sql; 
0

Bu sütunu kullanmak veritabanına boyunca tüm kısıtlamaları bulabilirsiniz:

SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU 
WHERE CCU.COLUMN_NAME='someColumn' 

çıkış kısıtlaması adını verir ve masa o takılır.

2

aşağıdaki sorgunun yardımıyla belirli tablolara atanmış isimleri ile birlikte tüm kısıt listesini alabilirsiniz: Ayrıca bu yürütebileceği tüm fk kısıtlaması bırak istiyorsanız

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME='YourTableName'; 

silmek istediğiniz kısıtlamayı bulduğunuzda sorgunun altında yardımı ile yapabilirsiniz:

ALTER TABLE Orders 
DROP CONSTRAINT constraint_name; 
İlgili konular