webentwicklung-frage-antwort-db.com.de

Wie überprüfe ich, ob eine Einschränkung auf dem SQL Server existiert?

Ich habe diese SQL:

ALTER TABLE dbo.ChannelPlayerSkins
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels

anscheinend hat die Einschränkung in einigen anderen Datenbanken, die wir verwenden, einen anderen Namen. Wie überprüfe ich, ob es eine Einschränkung mit dem Namen FK_ChannelPlayerSkins_Channels Gibt?.

239
Lieven Cardoen

versuche dies:

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

- EDIT -

Als ich diese Frage ursprünglich beantwortete, dachte ich an "Fremdschlüssel", da in der ursprünglichen Frage die Frage nach "FK_ChannelPlayerSkins_Channels" gestellt wurde. Seitdem haben sich viele Leute dazu geäußert, andere "Einschränkungen" zu finden. Hier einige andere Fragen dazu:

--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 Informationen zu Einschränkungen benötigen, schauen Sie in die gespeicherte Systemprozedur master.sys.sp_helpconstraint, um zu sehen, wie bestimmte Informationen abgerufen werden. Um den Quellcode mit SQL Server Management Studio anzuzeigen, rufen Sie den "Objekt-Explorer" auf. Von dort aus erweitern Sie die "Master" -Datenbank, dann "Programmierbarkeit", dann "Gespeicherte Prozeduren" und dann "Gespeicherte Systemprozeduren". Sie können dann "sys.sp_helpconstraint" finden und mit der rechten Maustaste darauf klicken und "modify" auswählen. Achten Sie nur darauf, keine Änderungen daran zu speichern. Sie können diese gespeicherte Systemprozedur auch einfach für jede Tabelle verwenden, indem Sie sie wie folgt verwenden: EXEC sp_helpconstraint YourTableNameHere.

320
KM.

Die einfachste Möglichkeit, das Vorhandensein einer Einschränkung zu überprüfen (und sie dann zu löschen, wenn sie existiert), ist die Verwendung der Funktion OBJECT_ID () ...

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 verwendet werden ('C' nur für Check-Constraints), und das funktioniert möglicherweise auch. Wenn Ihr Constraint-Name jedoch mit dem Namen anderer Objekte in der Datenbank übereinstimmt, können unerwartete Ergebnisse auftreten.

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 Fremdschlüssel-Einschränkungen oder Primärschlüssel-Einschränkungen usw. verwendet werden. Um optimale Ergebnisse zu erzielen, geben Sie immer den entsprechenden Objekttyp als zweiten Parameter für die OBJECT_ID-Funktion an:

Einschränkungsobjekttypen:

  • C = CHECK-Einschränkung
  • D = DEFAULT (Einschränkung oder Standalone)
  • F = FOREIGN KEY-Einschränkung
  • PK = PRIMARY KEY-Einschränkung
  • R = Regel (im alten Stil, eigenständig)
  • UQ = EINZIGARTIGE Einschränkung

Beachten Sie auch, dass das Schema häufig erforderlich ist. Das Schema der Einschränkungen entspricht im Allgemeinen dem Schema der übergeordneten Tabelle.

Wenn Sie Ihre Einschränkungen (oder was auch immer Sie überprüfen) nicht in Klammern setzen, wenn Sie diese Methode verwenden, kann dies auch zu einem falschen Negativ führen. Wenn Ihr Objekt ungewöhnliche Zeichen (wie z. B..) Verwendet, sind die Klammern erforderlich.

220
EricI

Wenn Sie nach einer anderen Art von Einschränkung suchen, z. Standardeinstellungen, Sie sollten eine andere Abfrage verwenden. (Von Wie finde ich eine Standardeinschränkung mit INFORMATION_SCHEMA? Beantwortet von devio ). Verwenden:

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

um eine Standardbedingung nach Namen zu suchen.

Ich habe verschiedene "Wenn nicht vorhanden" -Überprüfungen in meinem Beitrag zusammengestellt . DDL "Wenn nicht vorhanden" -Bedingungen, um SQL-Skripts wieder ausführbar zu machen

43
IF (OBJECT_ID('FK_ChannelPlayerSkins_Channels') IS NOT NULL)
26
DevDave

Betrachten Sie so etwas, wird unten in SQL Server 2005 getestet

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

Nur etwas auf das man achten muss ......

In SQL Server 2008 R2 SSMS wird mit dem Befehl "Script Constraint as -> DROP And CREATE To" T-SQL wie unten beschrieben erstellt

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

In diesem Skript wird die Einschränkung NICHT gelöscht, da SELECT 0 Zeilen zurückgibt. (Siehe Beitrag Microsoft Connect ).

Der Name der Standardeinschränkung ist falsch, aber meiner Meinung nach hat dies auch etwas mit der OBJECT_ID-Funktion zu tun, da das Ändern des Namens das Problem nicht behebt.

Um dies zu beheben, habe ich die Verwendung von OBJECT_ID entfernt und stattdessen den Standardeinschränkungsnamen verwendet.

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

Mit der folgenden Abfrage überprüfe ich, ob eine Einschränkung vorhanden ist, bevor ich sie erstelle.

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

Hiermit wird die Einschränkung anhand des Namens abgefragt, der auf einen bestimmten Tabellennamen abzielt. Hoffe das hilft.

7
Christo
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
3
Tim Masters
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 
3
StackOrder

INFORMATION_SCHEMA ist dein Freund. Es verfügt über alle Arten von Ansichten, die alle Arten von Schemainformationen anzeigen. Überprüfen Sie Ihre Systemansichten. Sie werden feststellen, dass Sie drei Ansichten haben, die sich mit Einschränkungen befassen, eine davon ist CHECK_CONSTRAINTS.

2
TomTom

Ich benutze dies, um nach Einschränkungen für eine Spalte zu suchen und diese zu entfernen. Es sollte alles haben, 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
        [email protected]_TableName
        AND [email protected]_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
1
user2196815

Sie können den obigen 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 

Benötige das name = [Constraint name], da eine Tabelle möglicherweise mehrere Fremdschlüssel enthält und der Fremdschlüssel noch nicht überprüft wurde

1
alaniane
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                
1
Christhian