Frage

Ich habe diese SQL:

ALTER TABLE dbo.ChannelPlayerSkins
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels

aber anscheinend auf einigen anderen Datenbanken nutzen wir, hat die Einschränkung einen anderen Namen. Wie kann ich überprüfen, ob es eine Einschränkung mit dem Namen FK_ChannelPlayerSkins_Channels ist.

War es hilfreich?

Lösung

versuchen, diese:

SELECT
    * 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    WHERE CONSTRAINT_NAME ='FK_ChannelPlayerSkins_Channels'

- EDIT -

Als ich antwortete ursprünglich diese Frage, dachte ich „Foreign Key“, weil die ursprüngliche Frage zu finden „FK_ChannelPlayerSkins_Channels“ fragte. Seitdem haben viele Menschen hier auf der Suche nach anderen „Einschränkungen“, kommentiert für, dass einige weitere Fragen sind:

--Returns one row for each CHECK, UNIQUE, PRIMARY KEY, and/or FOREIGN KEY
SELECT * 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_NAME='XYZ'  


--Returns one row for each FOREIGN KEY constrain
SELECT * 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    WHERE CONSTRAINT_NAME='XYZ'


--Returns one row for each CHECK constraint 
SELECT * 
    FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
    WHERE CONSTRAINT_NAME='XYZ'

Hier ist eine alternative Methode

--Returns 1 row for each CHECK, UNIQUE, PRIMARY KEY, FOREIGN KEY, and/or DEFAULT
SELECT 
    OBJECT_NAME(OBJECT_ID) AS NameofConstraint
        ,SCHEMA_NAME(schema_id) AS SchemaName
        ,OBJECT_NAME(parent_object_id) AS TableName
        ,type_desc AS ConstraintType
    FROM sys.objects
    WHERE type_desc LIKE '%CONSTRAINT'
        AND OBJECT_NAME(OBJECT_ID)='XYZ'

Wenn Sie noch mehr Zwang Informationen benötigen, Blick in dem System gespeicherte Prozedur master.sys.sp_helpconstraint, um zu sehen, wie bestimmte Informationen zu erhalten. Um zu sehen, bekommen den Quellcode mithilfe von SQL Server Management Studio in das „Objekt-Explorer“. Von dort können Sie den „Master“ -Datenbank, erweitern Sie dann „Programmierbarkeit“, dann „Stored Procedures“, dann „System Stored Procedures“. Sie können dann „sys.sp_helpconstraint“ finden und rechte Maustaste und wählen Sie „Ändern“. Nur vorsichtig sein, um keine Änderungen zu speichern. Auch Sie können nur mit diesem System gespeicherte Prozedur auf einer Tabelle, indem sie es wie EXEC sp_helpconstraint YourTableNameHere verwendet wird.

Andere Tipps

Der einfachste Weg für die Existenz einer Einschränkung zu überprüfen (und dann etwas tun, wie Tropfen es, wenn es vorhanden ist) ist die OBJECT_ID () Funktion ...

zu verwenden,
IF OBJECT_ID('dbo.[CK_ConstraintName]', 'C') IS NOT NULL 
    ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName

OBJECT_ID kann, ohne den zweiten Parameter ( ‚C‘ für Check-Einschränkungen nur) verwendet werden, und das kann auch arbeiten, aber wenn Ihr Constraintname den Namen anderer Objekte in der Datenbank übereinstimmt können Sie unerwartete Ergebnisse erhalten.

IF OBJECT_ID('dbo.[CK_ConstraintName]') IS NOT NULL 
    ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName

OBJECT_ID kann auch mit anderen „Einschränkungen“ wie Foreign Key Constraints oder Primärschlüssel usw. Für die besten Ergebnisse immer auch den entsprechenden Objekttyp als zweiten Parameter für die OBJECT_ID Funktion verwendet werden:

Constraint-Objekttypen:

  • C = CHECK-Einschränkung
  • D = STANDARD (Einschränkung oder stand-alone)
  • = F FOREIGN KEY-Einschränkung
  • = PK PRIMARY KEY-Einschränkung
  • R = Regel (im alten Stil, stand-alone)
  • UQ = UNIQUE

Beachten Sie auch, dass das Schema ist oft erforderlich. Das Schema von Einschränkungen dauert in der Regel das Schema der übergeordneten Tabelle.

Failure Ihre Zwänge setzen (oder was auch immer Sie überprüfen) in Klammern bei dieser Methode können auch Ursache einer falschen negativen - (. Wie a), wenn Ihr Objekt ungewöhnliche Zeichen verwendet, werden die Klammern erforderlich.

Wenn Sie sich für eine andere Art von Einschränkung suchen, zum Beispiel Standardwerte, sollten Sie verschiedene Abfrage verwenden (Von Wie finde ich einen Standard mit INFORMATION_SCHEMA Zwang? beantwortet von devio ). Verwendung:

SELECT * FROM sys.objects WHERE type = 'D' AND name = @name

eine Standardeinschränkung mit Namen zu finden.

Ich habe zusammen verschiedene ‚setzen, wenn nicht vorhanden“ Kontrollen in meinem Beitrag ‚ DDL‚if not exists "Bedingungen SQL-Skripte erneut runnable"

machen
IF (OBJECT_ID('FK_ChannelPlayerSkins_Channels') IS NOT NULL)

Suchen Sie auf so etwas, unten in SQL Server 2005 getestet wird

SELECT * FROM sys.check_constraints WHERE 
object_id = OBJECT_ID(N'[dbo].[CK_accounts]') AND 
parent_object_id = OBJECT_ID(N'[dbo]. [accounts]')

Nur etwas aufpassen für ......

In SQL Server 2008 R2 SSMS, das "Script Constraint als -> DROP und CREATE" Befehl erzeugt T-SQL wie unter

USE [MyDatabase]
GO

IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DEF_Detail_IsDeleted]') AND type = 'D')
BEGIN
ALTER TABLE [Patient].[Detail] DROP CONSTRAINT [DEF_Detail_IsDeleted]
END

GO

USE [MyDatabase]
GO

ALTER TABLE [Patient].[Detail] ADD  CONSTRAINT [DEF_Detail_IsDeleted]  DEFAULT ((0)) FOR [IsDeleted]
GO

Aus dem Kasten heraus, dieses Skript fällt nicht die Einschränkung, weil die SELECT 0 Zeilen zurückgibt. (Siehe Beitrag Microsoft Connect ).

Der Name der Standardeinschränkung ist falsch, aber ich sammle sie hat auch etwas mit der OBJECT_ID Funktion zu tun, weil die Änderung des Namens das Problem nicht beheben.

Um dies zu beheben, entfernte ich die Verwendung von OBJECT_ID und den Standard Constraintname stattdessen verwendet.

(SELECT * FROM dbo.sysobjects WHERE [name] = (N'DEF_Detail_IsDeleted') AND type = 'D')

Ich verwende die folgende Abfrage für eine bestehende Einschränkung zu überprüfen, bevor ich es schaffen.

IF (NOT EXISTS(SELECT 1 FROM sysconstraints WHERE OBJECT_NAME(constid) = 'UX_CONSTRAINT_NAME' AND OBJECT_NAME(id) = 'TABLE_NAME')) BEGIN
...
END

Diese Anfragen für die Einschränkung von Namen einen bestimmten Tabellennamen Targeting. Hoffe, das hilft.

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.TableName'))
 BEGIN 
ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME 
END 
IF EXISTS(SELECT TOP 1 1 FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID(N'[dbo].[ChannelPlayerSkins]') AND name = 'FK_ChannelPlayerSkins_Channels')
BEGIN
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels
END
GO

INFORMATION_SCHEMA ist dein Freund. Er hat alle Arten von Ansichten, die alle Arten von Schemainformationen zeigen. Überprüfen Sie die Systemansichten. Sie haben Sie drei Ansichten mit Einschränkungen zu tun finden, ein Wesen CHECK_CONSTRAINTS.

ich diese verwenden für und Remote-Einschränkungen auf einer Säule zu überprüfen. Es sollte alles, was Sie brauchen.

DECLARE
  @ps_TableName VARCHAR(300)
  , @ps_ColumnName VARCHAR(300)

SET @ps_TableName = 'mytable'
SET @ps_ColumnName = 'mycolumn'

DECLARE c_ConsList CURSOR LOCAL STATIC FORWARD_ONLY FOR
    SELECT
    'ALTER TABLE ' + RTRIM(tb.name) + ' drop constraint ' + sco.name AS csql
    FROM
        sys.Objects tb
        INNER JOIN sys.Columns tc on (tb.Object_id = tc.object_id)
        INNER JOIN sys.sysconstraints sc ON (tc.Object_ID = sc.id and tc.column_id = sc.colid)
        INNER JOIN sys.objects sco ON (sc.Constid = sco.object_id)
    where
        tb.name=@ps_TableName
        AND tc.name=@ps_ColumnName
OPEN c_ConsList
FETCH c_ConsList INTO @ls_SQL
WHILE (@@FETCH_STATUS = 0) BEGIN

    IF RTRIM(ISNULL(@ls_SQL, '')) <> '' BEGIN
        EXECUTE(@ls_SQL)
    END
    FETCH c_ConsList INTO @ls_SQL
END
CLOSE c_ConsList
DEALLOCATE c_ConsList
SELECT tabla.name as Tabla,

        restriccion.name as Restriccion, 
        restriccion.type as Tipo, 
        restriccion.type_desc as Tipo_Desc
FROM {DATABASE_NAME}.sys.objects tabla 

INNER JOIN {DATABASE_NAME}.sys.objects restriccion

ON tabla.object_id = restriccion.parent_object_id

WHERE tabla.type = 'U' - Solo tablas creadas por el usuario.

AND restriccion.type = 'UQ' --Tipo de Restriccion UNIQUE

ORDER BY tabla.name, restriccion.type_desc                

Sie können die oben mit einer Einschränkung verwenden:

IF EXISTS(
    SELECT 1 FROM sys.foreign_keys 
    WHERE parent_object_id = OBJECT_ID(N'dbo.TableName') 
        AND name = 'CONSTRAINTNAME'
)
BEGIN 
    ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME 
END 

Notwendigkeit, die name = [Constraint name] zu verwenden, da eine Tabelle mehr Fremdschlüssel haben kann und hat immer noch nicht den Fremdschlüssel für geprüft wird

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top