2013-02-27 10 views
12

Ho la seguente:Come posso eliminare una tabella se esiste un vincolo di chiave esterna in SQL Server?

DROP TABLE [dbo].[ExtraUserInformation]; 
DROP TABLE [dbo].[UserProfile]; 
DROP TABLE [dbo].[webpages_Membership]; 
DROP TABLE [dbo].[webpages_OAuthMembership]; 
DROP TABLE [dbo].[webpages_Roles]; 
DROP TABLE [dbo].[webpages_UsersInRoles]; 

CREATE TABLE [dbo].[ExtraUserInformation] (
    [Id]  INT   IDENTITY (1, 1) NOT NULL, 
    [UserId] INT   NOT NULL, 
    [FullName] NVARCHAR (MAX) NULL, 
    [Link]  NVARCHAR (MAX) NULL, 
    [Verified] BIT   NULL, 
    CONSTRAINT [PK_dbo.ExtraUserInformation] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

CREATE TABLE [dbo].[webpages_UsersInRoles] (
    [UserId] INT NOT NULL, 
    [RoleId] INT NOT NULL, 
    PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC), 
    CONSTRAINT [fk_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[UserProfile] ([UserId]), 
    CONSTRAINT [fk_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[webpages_Roles] ([RoleId]) 
); 

tuttavia questo è guasto con un messaggio che dice:

Msg 3726, Level 16, State 1, Line 6 
Could not drop object 'dbo.UserProfile' because it is referenced by a FOREIGN KEY constraint. 
Msg 3726, Level 16, State 1, Line 9 
Could not drop object 'dbo.webpages_Roles' because it is referenced by a FOREIGN KEY constraint. 
Msg 2714, Level 16, State 6, Line 27 
There is already an object named 'UserProfile' in the database. 
Checking identity information: current identity value 'NULL', current column value 'NULL'. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

Come posso eliminare una tabella in queste circostanze?

+0

riferimenti goccia primo – Sergio

+0

Check out questa domanda: http://stackoverflow.com/questions/1776079/sql-drop-table-foreign-key-constraint Questa è un'attività SQL Server comune – MPH

+0

devi DROP CONSTRAINS –

risposta

14

È necessario rilasciare il vincolo prima di poter rilasciare la tabella. Altrettanto saggia la violazione delle regole. Come ottenere relazioni con le chiavi esterne, vedi questa vecchia domanda. SQL DROP TABLE foreign key constraint

4

1: in primo luogo, rilasciare il vincolo di chiave esterna dopo aver rilasciato le tabelle.

2 si può cadere tutto chiave esterna tramite l'esecuzione della seguente query:

DECLARE @SQL varchar(4000)='' 
SELECT @SQL = 
@SQL + 'ALTER TABLE ' + s.name+'.'+t.name + ' DROP CONSTRAINT [' + RTRIM(f.name) +'];' + CHAR(13) 
FROM sys.Tables t 
INNER JOIN sys.foreign_keys f ON f.parent_object_id = t.object_id 
INNER JOIN sys.schemas  s ON s.schema_id = f.schema_id 

--EXEC (@SQL) 

PRINT @SQL 

se si esegue la risultati @SQL stampata, le chiavi esterne verranno eliminati.

3

la migliore risposta per far cadere la tabella che contiene i vincoli stranieri è:

  • Fase 1: Eliminare la chiave primaria della tabella.
  • Passaggio 2: Ora verrà richiesto se eliminare tutti i riferimenti esterni o meno.
  • Passaggio 3: eliminare la tabella.
-1

Per eliminare una tabella se esiste un vincolo di chiave esterna in MySQL Server?

Eseguire la query SQL:

SET FOREIGN_KEY_CHECKS = 0; DROP TABLE table_name

Spero che sia d'aiuto!

+1

La domanda riguarda Microsoft SQL Server non MySQL –

+0

risolto il mio problema. –

1

BhupeshC and murat, questo è quello che stavo cercando. Tuttavia @SQL varchar (4000) non era abbastanza grande. Quindi, piccola modifica

DECLARE @cmd varchar(4000) 

DECLARE MY_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 

select 'ALTER TABLE ['+s.name+'].['+t.name+'] DROP CONSTRAINT [' + RTRIM(f.name) +'];' FROM sys.Tables t INNER JOIN sys.foreign_keys f ON f.parent_object_id = t.object_id INNER JOIN sys.schemas s ON s.schema_id = f.schema_id 

OPEN MY_CURSOR 
FETCH NEXT FROM MY_CURSOR INTO @cmd 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    -- EXEC (@cmd) 
    PRINT @cmd 
    FETCH NEXT FROM MY_CURSOR INTO @cmd 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 

GO 
2

È necessario eliminare il vincolo prima di abbandonare la tabella.

È possibile utilizzare tali query per trovare tutti gli FK nella tabella e trovare gli FK nelle tabelle in cui viene utilizzata la tabella.

Declare @SchemaName VarChar(200) = 'Your Schema name' 
Declare @TableName VarChar(200) = 'Your Table Name' 

-- Find FK in This table. 
SELECT 
    ' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = 
OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
+ ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + 
OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    'ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.parent_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 


-- Find the FKs in the tables in which this table is used 
    SELECT 
    ' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = 
     OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
    + ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + 
OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    ' ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.referenced_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 
+0

Procedura eccellente !! – raBinn

Problemi correlati