none
Obtener información de las relaciones de una tabla mediante INFORMATION_SCHEMA. RRS feed

  • Pregunta

  • Hola:

    Tengo una vista que me da información de las 'relaciones' existentes en una base de datos, pero no 'veo' donde saber si una relación está activa (ALTER TABLE ... WITH CHECK ADD CONSTRAINT ...) o inactiva (ALTER TABLE ... WITH NOCHECK ADD CONSTRAINT ...). Un ejemplo para probar lo que quiero:

    Creamos las tablas y las relaciones:

    CREATE TABLE [dbo].[PARENTTBL](
    	[PK] [int] NOT NULL,
     CONSTRAINT [PK_PARENTTBL] PRIMARY KEY CLUSTERED 
    (
    	[PK] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[CHILDTABLE](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[FK1] [int] NOT NULL,
    	[FK2] [int] NOT NULL,
     CONSTRAINT [PK_CHILDTABLE] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[CHILDTABLE]  WITH CHECK ADD  CONSTRAINT [FK_CHILDTABLE_PARENTTBL_1] FOREIGN KEY([FK1])
    REFERENCES [dbo].[PARENTTBL] ([PK])
    GO
    
    ALTER TABLE [dbo].[CHILDTABLE] CHECK CONSTRAINT [FK_CHILDTABLE_PARENTTBL_1]
    GO
    
    ALTER TABLE [dbo].[CHILDTABLE]  WITH NOCHECK ADD  CONSTRAINT [FK_CHILDTABLE_PARENTTBL_2] FOREIGN KEY([FK2])
    REFERENCES [dbo].[PARENTTBL] ([PK])
    GO
    
    ALTER TABLE [dbo].[CHILDTABLE] NOCHECK CONSTRAINT [FK_CHILDTABLE_PARENTTBL_2]
    GO

    Hacemos una vista para obtener las relaciones existentes:

    /*	!!!
    			COMO PUEDO SABER QUE 'FK_CHILDTABLE_PARENTTBL_2' TIENE LA OPCION 'NOCHECK'
    	!!!
    */
    SELECT			TBL_ORIGEN.CONSTRAINT_SCHEMA + '.' + TBL_ORIGEN.CONSTRAINT_NAME	AS RELATION
    			,	TBL_REL.TABLE_SCHEMA		+ '.' + TBL_REL.TABLE_NAME			AS PARENT_TBL
    			,	TBL_ORIGEN.TABLE_SCHEMA		+ '.' + TBL_ORIGEN.TABLE_NAME		AS CHILD_TBL
    			,	TBL_REL.CONSTRAINT_SCHEMA	+ '.' + TBL_REL.CONSTRAINT_NAME		AS CHILD_KEY
    			, REL_FK.UPDATE_RULE, REL_FK.DELETE_RULE
    FROM		INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE AS TBL_ORIGEN
    			LEFT OUTER JOIN	INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS REL_FK ON 
    					REL_FK.CONSTRAINT_CATALOG = TBL_ORIGEN.CONSTRAINT_CATALOG AND 
    					REL_FK.CONSTRAINT_SCHEMA = TBL_ORIGEN.CONSTRAINT_SCHEMA AND 
    					REL_FK.CONSTRAINT_NAME = TBL_ORIGEN.CONSTRAINT_NAME
    			LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE AS TBL_REL ON 
    					TBL_REL.TABLE_CATALOG = REL_FK.UNIQUE_CONSTRAINT_CATALOG AND 
    					TBL_REL.TABLE_SCHEMA = REL_FK.UNIQUE_CONSTRAINT_SCHEMA AND 
    					TBL_REL.CONSTRAINT_NAME = REL_FK.UNIQUE_CONSTRAINT_NAME
    WHERE     NOT TBL_REL.CONSTRAINT_NAME IS NULL AND
    	TBL_ORIGEN.TABLE_NAME = 'CHILDTABLE'

    La pregunta es ¿Como puedo en una vista, saber si una 'relación' está activa o no?

    Un saludo

    viernes, 15 de noviembre de 2019 11:06

Respuestas

  • Podrías hacer un select sobre la vista de sistema sys.foreign_keys. Si no me equivoco, la columna is_disabled te devuelve el dato que quieres. Creo que no hay nada en INFORMATION_SCHEMA que te devuelva esa misma información.

    • Propuesto como respuesta Pablo RubioModerator viernes, 15 de noviembre de 2019 16:11
    • Marcado como respuesta LG DES lunes, 18 de noviembre de 2019 9:18
    viernes, 15 de noviembre de 2019 11:43