sql-server - una - restricciones unique sql server
¿Cómo verificar si existe una restricción en el servidor SQL? (13)
¿Está viendo algo como esto, a continuación se prueba en 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]'')
Tengo este sql
ALTER TABLE dbo.ChannelPlayerSkins
DROP CONSTRAINT FK_ChannelPlayerSkins_Channels
pero aparentemente, en algunas otras bases de datos que usamos, la restricción tiene un nombre diferente. ¿Cómo FK_ChannelPlayerSkins_Channels
si hay una restricción con el nombre FK_ChannelPlayerSkins_Channels
?
INFORMACIÓN_SCHEMA es tu amigo. Tiene todo tipo de vistas que muestran todo tipo de información de esquema. Revise las vistas de su sistema. Encontrará que tiene tres vistas relacionadas con las restricciones, una de ellas es CHECK_CONSTRAINTS.
La forma más fácil de verificar la existencia de una restricción (y luego hacer algo como eliminarla si existe) es usar la función OBJECT_ID () ...
IF OBJECT_ID(''dbo.[CK_ConstraintName]'', ''C'') IS NOT NULL
ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName
OBJECT_ID se puede usar sin el segundo parámetro (''C'' solo para restricciones de verificación) y también puede funcionar, pero si su nombre de restricción coincide con el nombre de otros objetos en la base de datos, puede obtener resultados inesperados.
IF OBJECT_ID(''dbo.[CK_ConstraintName]'') IS NOT NULL
ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName
OBJECT_ID también se puede usar con otras "restricciones", como las restricciones de clave externa o las restricciones de clave principal, etc. Para obtener los mejores resultados, incluya siempre el tipo de objeto apropiado como segundo parámetro para la función OBJECT_ID:
Tipos de objetos de restricción:
- C = restricción CHECK
- D = POR DEFECTO (restricción o independiente)
- F = restricción FOREIGN KEY
- PK = restricción de CLAVE PRIMARIA
- R = Regla (estilo antiguo, independiente)
- UQ = restricción UNICA
También tenga en cuenta que el esquema es a menudo necesario. El esquema de restricciones generalmente toma el esquema de la tabla principal.
Si no pone sus restricciones (o lo que esté marcando) entre corchetes al usar este método, también puede causar un falso negativo: si su objeto usa caracteres inusuales (como a.), Se requieren corchetes.
Puedes usar el de arriba con una advertencia:
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
Debe usar el name = [Constraint name]
ya que una tabla puede tener varias claves externas y aún así no se puede verificar la clave externa
Si está buscando otro tipo de restricción, p. Ej., Valores predeterminados, debe usar una consulta diferente (desde ¿Cómo encuentro una restricción predeterminada utilizando INFORMATION_SCHEMA? Respondida por devio ). Utilizar:
SELECT * FROM sys.objects WHERE type = ''D'' AND name = @name
para encontrar una restricción por defecto por nombre.
He reunido diferentes condiciones de ''Si no existe'' verifica en mi publicación " DDL ''Si no existe" condiciones para que los scripts SQL puedan volver a ejecutarse "
Solo algo a tener en cuenta para ......
En SQL Server 2008 R2 SSMS, el comando "Restricción de secuencia de comandos como -> DROP y CREAR para" produce T-SQL como a continuación
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
Fuera de la caja, esta secuencia de comandos NO elimina la restricción porque SELECT devuelve 0 filas. (ver post Microsoft Connect ).
El nombre de la restricción predeterminada es incorrecto, pero supongo que también tiene algo que ver con la función OBJECT_ID porque cambiar el nombre no soluciona el problema.
Para solucionar este problema, eliminé el uso de OBJECT_ID y usé el nombre de restricción predeterminado en su lugar.
(SELECT * FROM dbo.sysobjects WHERE [name] = (N''DEF_Detail_IsDeleted'') AND type = ''D'')
Utilizo esto para verificar y las restricciones remotas en una columna. Debe tener todo lo que necesitas.
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
Utilizo la siguiente consulta para verificar una restricción existente antes de crearla.
IF (NOT EXISTS(SELECT 1 FROM sysconstraints WHERE OBJECT_NAME(constid) = ''UX_CONSTRAINT_NAME'' AND OBJECT_NAME(id) = ''TABLE_NAME'')) BEGIN
...
END
Esto consulta la restricción por nombre que se dirige a un nombre de tabla dado. Espero que esto ayude.
prueba esto:
SELECT
*
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_NAME =''FK_ChannelPlayerSkins_Channels''
- EDITAR -
Cuando contesté originalmente esta pregunta, estaba pensando en "Clave externa" porque la pregunta original preguntaba acerca de cómo encontrar "FK_ChannelPlayerSkins_Channels". Desde entonces, muchas personas han comentado sobre encontrar otras "restricciones" aquí hay algunas otras consultas para eso:
--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''
aquí hay un método alternativo
--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 necesita aún más información sobre restricciones, consulte el procedimiento almacenado del sistema master.sys.sp_helpconstraint
para ver cómo obtener cierta información. Para ver el código fuente utilizando SQL Server Management Studio, acceda al "Explorador de objetos". Desde allí, expandirá la base de datos "Maestra", luego expandirá "Programabilidad", luego "Procedimientos almacenados" y luego "Procedimientos almacenados del sistema". Luego puede encontrar "sys.sp_helpconstraint" y hacer clic con el botón derecho y seleccionar "modificar". Sólo tenga cuidado de no guardar ningún cambio en él. Además, puede usar este procedimiento almacenado del sistema en cualquier tabla si lo usa como EXEC sp_helpconstraint YourTableNameHere
.
IF (OBJECT_ID(''FK_ChannelPlayerSkins_Channels'') IS NOT NULL)
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
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