2013-02-27 12 views
12

mam następujące:Jak mogę upuścić tabelę, jeśli istnieje ograniczenie klucza obcego w 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]) 
); 

Jednak to się niepowodzeniem z komunikatem mówiąc:

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. 

Jak mogę spaść stolik w tych okolicznościach?

+0

referencje drop pierwszy – Sergio

+0

Sprawdź to pytanie: http://stackoverflow.com/questions/1776079/sql-drop-table-foreign-key-constraint Jest to typowe zadanie serwera SQL – MPH

+0

, które należy ZARZĄDZAĆ CONSTRAINS –

Odpowiedz

4

1-po pierwsze, usuń ograniczenie klucza obcego po tym, jak upuść tabele.

2-można upuścić wszystkie klucza obcego poprzez wykonując następujące zapytanie:

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 

jeśli wykonanie wydruku wyników @SQL, klucze obce zostanie usunięty.

3

najlepszą odpowiedzią na upuszczenie tabeli zawierającej zagranicznych ograniczenia to:

  • Krok 1: Usuń klucz podstawowy tabeli.
  • Krok 2: Teraz pojawi się pytanie, czy usunąć wszystkie obce referencje, czy nie.
  • Krok 3: Usuń tabelę.
-1

Aby usunąć tabelę, jeśli istnieje ograniczenie dotyczące klucza obcego w serwerze MySQL?

uruchomieniu zapytania SQL:

SET FOREIGN_KEY_CHECKS = 0; STOLIK DROP nazwa_tabeli

Mam nadzieję, że pomoże!

+1

Pytanie dotyczy Microsoft SQL Server, a nie MySQL –

+0

rozwiązało mój problem. –

1

BhupeshC and murat, tego właśnie szukałem. Jednak varchar @SQL (4000) nie był wystarczająco duży. Tak więc, mała zmiana:

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

Musisz upuścić wiązanie zanim upuścisz stół.

Możesz użyć tych zapytań, aby znaleźć wszystkie FK w tabeli i znaleźć FK w tabelach, w których jest używana twoja tabela.

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

Doskonała procedura !! – raBinn

Powiązane problemy