Comment vérifier si un serveur EXISTS dans Sql?
-
21-09-2019 - |
Question
J'ai cette sql:
ALTER TABLE dbo.ChannelPlayerSkins
DROP CONSTRAINT FK_ChannelPlayerSkins_Channels
mais apparemment, sur d'autres bases de données que nous utilisons, la contrainte a un nom différent. Comment puis-je vérifier s'il y a une contrainte avec le nom FK_ChannelPlayerSkins_Channels
.
La solution
essayez ceci:
SELECT
*
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_ChannelPlayerSkins_Channels'
- EDIT -
Quand je répondu à cette question à l'origine, je pensais « clé étrangère » parce que la question initiale a demandé de trouver « FK_ChannelPlayerSkins_Channels ». Depuis lors, beaucoup de gens ont fait des commentaires sur la recherche d'autres « contraintes », voici quelques autres requêtes pour que:
--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'
Voici une autre méthode
--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'
Si vous avez besoin d'informations encore plus contrainte, regarder à l'intérieur de la procédure stockée système master.sys.sp_helpconstraint
pour voir comment obtenir certaines informations. Pour afficher le code source à l'aide SQL Server Management Studio entrer dans le "Object Explorer". De là, vous développez la base de données « Master », puis développez « programmabilité », puis « Procédures stockées », puis « Procédures stockées système ». Vous pouvez alors trouver « sys.sp_helpconstraint » et faites un clic droit dessus et sélectionnez « modifier ». Il suffit de faire attention à ne pas enregistrer les modifications. En outre, vous pouvez simplement utiliser ce système procédure stockée sur une table en utilisant comme EXEC sp_helpconstraint YourTableNameHere
.
Autres conseils
meilleure façon de vérifier l'existence d'une contrainte (puis faire quelque chose comme laisser tomber si elle existe) est d'utiliser la fonction OBJECT_ID () ...
IF OBJECT_ID('dbo.[CK_ConstraintName]', 'C') IS NOT NULL
ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName
OBJECT_ID peut être utilisé sans le second paramètre ( « C » pour les contraintes de vérification seulement) et qui peuvent également fonctionner, mais si votre nom de contrainte correspond au nom d'autres objets dans la base de données que vous pouvez obtenir des résultats inattendus.
IF OBJECT_ID('dbo.[CK_ConstraintName]') IS NOT NULL
ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName
OBJECT_ID peut également être utilisé avec d'autres « contraintes » telles que les clés étrangères ou les contraintes principales clés, etc. Pour de meilleurs résultats, toujours inclure le type d'objet approprié comme second paramètre pour la fonction OBJECT_ID:
Types d'objet Contrainte:
- C = contrainte CHECK
- D = DEFAULT (contrainte ou autonome)
- F = contrainte FOREIGN KEY
- PK = contrainte de clé primaire
- R = Règle (ancienne, autonome)
- UQ = UNIQUE
Notez également que le schéma est souvent nécessaire. Le schéma des contraintes prend généralement le schéma de la table parent.
Le défaut de mettre vos contraintes (ou tout ce que vous checking) entre parenthèses lors de l'utilisation de cette méthode peut également provoquer un faux négatif - (. Tels que: a) si votre objet utilise des caractères inhabituels, les supports sont nécessaires.
Si vous êtes à la recherche d'un autre type de contrainte, par exemple par défaut, vous devez utiliser différentes requêtes (De Comment puis-je trouver un défaut contrainte à l'aide INFORMATION_SCHEMA? a répondu par devio ). Utilisation:
SELECT * FROM sys.objects WHERE type = 'D' AND name = @name
pour trouver une contrainte par défaut par son nom.
Je l'ai mis en place différentes « IF NOT EXISTS » contrôles dans mon post " LDD « IF NOT EXISTS "conditions pour faire des scripts SQL ré-runnable"
IF (OBJECT_ID('FK_ChannelPlayerSkins_Channels') IS NOT NULL)
Vous cherchez quelque chose comme ça, ci-dessous est testé dans SQL Server 2005
SELECT * FROM sys.check_constraints WHERE
object_id = OBJECT_ID(N'[dbo].[CK_accounts]') AND
parent_object_id = OBJECT_ID(N'[dbo]. [accounts]')
Juste quelque chose à surveiller ......
Dans SQL Server 2008 R2 SSMS, le "Script Constraint comme -> DROP et CREATE Pour" commande produit T-SQL comme ci-dessous
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
Hors de la boîte, ce script ne laissez pas tomber la contrainte parce que le SELECT renvoie 0 lignes. (Voir post Microsoft Connect ).
Le nom de la contrainte par défaut est erronée, mais je rassemblerai il a aussi quelque chose à voir avec la fonction OBJECT_ID parce que changer le nom ne résout pas le problème.
Pour résoudre ce problème, je l'ai enlevé l'utilisation de OBJECT_ID et a utilisé le nom de contrainte par défaut à la place.
(SELECT * FROM dbo.sysobjects WHERE [name] = (N'DEF_Detail_IsDeleted') AND type = 'D')
J'utilise la requête suivante pour vérifier une contrainte existante avant de le créer.
IF (NOT EXISTS(SELECT 1 FROM sysconstraints WHERE OBJECT_NAME(constid) = 'UX_CONSTRAINT_NAME' AND OBJECT_NAME(id) = 'TABLE_NAME')) BEGIN
...
END
requêtes de la contrainte par nom ciblant un nom de table donné. Espérons que cela aide.
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
est votre ami. Il a toutes sortes de vues qui montrent toutes sortes d'informations de schéma. Vérifiez votre point de vue du système. Vous trouverez vous avez trois vues prises avec des contraintes, l'une étant CHECK_CONSTRAINTS
.
Je l'utiliser pour vérifier et les contraintes à distance sur une colonne. Il devrait avoir tout ce dont vous avez besoin.
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
Vous pouvez utiliser celui ci-dessus avec une mise en garde:
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
Vous avez besoin d'utiliser le name = [Constraint name]
depuis une table peut avoir plusieurs clés étrangères et toujours pas la clé étrangère en cours de vérification pour