Как получить информацию об ограничении таблицы в SQL Server - PullRequest
0 голосов
/ 08 января 2019

Мне нужно вывести информацию об ограничениях для данной таблицы. Я нашел много тесно связанной информации здесь, в SO, но я не нахожу пару конкретных частей информации.

Мне нужно, чтобы результат выглядел так в результатах запроса:

CONSTRAINT_NAME CONSTRAINT_TYPE COLUMN_NAME REFERENCED_TABLE REFERENCED_COLUMN

В настоящее время у меня есть этот запрос:

SELECT
obj_Constraint.NAME AS CONSTRAINT_NAME,
obj_Constraint.type_desc AS CONSTRAINT_TYPE,
'' AS COLUMN_NAME,
'' AS REFERENCED_TABLE,
columns.NAME AS REFERENCED_COLUMN
FROM sys.objects AS obj_table 
LEFT JOIN sys.objects AS obj_Constraint ON obj_table.object_id = obj_Constraint.parent_object_id 
LEFT JOIN sys.sysconstraints AS constraints ON constraints.constid = obj_Constraint.object_id 
LEFT JOIN sys.columns AS columns ON columns.object_id = obj_table.object_id AND columns.column_id = constraints.colid 
WHERE obj_table.name = 'some_table'
ORDER BY obj_Constraint.type_desc

Откуда я могу получить информацию о ссылочной таблице (внешнем ключе) и столбце?

(мне нужен запрос, совместимый с версиями SQL Server 2008 и более поздними версиями)

EDIT

Исходя из первоначальных ответов, я, возможно, не получил четкого представления о желаемых результатах.

Допустим, у меня есть таблица "people" с колонками "poepleID", "name", "city", "stateID". Первичный ключ находится в столбце poepleID. У меня также есть таблица "States" с "StateID" и "State". Первичный ключ для этого находится в столбце stateID. Вы можете догадаться, что у меня есть ограничение внешнего ключа для people.stateID. Я назову это FK__people__states__stateID

Так что мне нужен запрос, который выведет это:

CONSTRAINT_NAME                 CONSTRAINT_TYPE            COLUMN_NAME     REFERENCED_TABLE     REFERENCED_COLUMN
PK__people                      PRIMARY_KEY_CONSTRAINT     peopleID              
FK__people__states__stateID     FOREIGN_KEY_CONSTRAINT     stateID         states               stateID

Мне нужно перечислить все ключевые ограничения (первичные, внешние - любые) в рассматриваемой таблице (в данном случае "люди").

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я думаю, вы могли бы использовать sysreferences и проверить этот пост для кода. Существует также инструмент под названием Расширенные зависимости SQL Server , который может быть полезен.

0 голосов
/ 08 января 2019

Используйте представление схемы INFORMATION_SCHEMA.TABLE_CONSTRAINTS и INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.

Этот запрос показывает все внешние ключи, например:

SELECT
    ConstraintName = C.CONSTRAINT_NAME,
    PrimaryKeyTable = QUOTENAME(PK.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(PK.TABLE_NAME),
    PrimaryKeyColumn = CCU.COLUMN_NAME,
    ForeignKeyTable = QUOTENAME(FK.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(FK.TABLE_NAME),
    ForeignKeyColumn = CU.COLUMN_NAME,
    UpdateRule = C.UPDATE_RULE,
    DeleteRule = C.DELETE_RULE
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON 
        C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME AND
        C.CONSTRAINT_CATALOG = FK.CONSTRAINT_CATALOG AND
        C.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON 
        C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME AND
        C.UNIQUE_CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG AND
        C.UNIQUE_CONSTRAINT_SCHEMA = PK.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON 
        C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME AND
        C.CONSTRAINT_CATALOG = CU.CONSTRAINT_CATALOG AND
        C.CONSTRAINT_SCHEMA = CU.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON 
        PK.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME AND
        PK.CONSTRAINT_CATALOG = CCU.CONSTRAINT_CATALOG AND
        PK.CONSTRAINT_SCHEMA = CCU.CONSTRAINT_SCHEMA
WHERE
    FK.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY
    PK.TABLE_NAME, 
    FK.TABLE_NAME

Я полагаю, что вы способны обойти это, чтобы получить желаемые результаты в одном запросе.


Пример:

CREATE TABLE PKTable (
    PKColumn INT PRIMARY KEY,
    CheckValue INT,
    CHECK (CheckValue > 0))

CREATE TABLE FKTable (
    FKColumn INT, 
    FOREIGN KEY (FKColumn) REFERENCES PKTable (PKColumn))


DECLARE @TableName VARCHAR(100) = 'PKTable'

-- Primary keys, checks
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS T WHERE T.TABLE_NAME = @TableName

-- Foreign keys
SELECT
    ConstraintName = C.CONSTRAINT_NAME,
    PrimaryKeyTable = QUOTENAME(PK.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(PK.TABLE_NAME),
    PrimaryKeyColumn = CCU.COLUMN_NAME,
    ForeignKeyTable = QUOTENAME(FK.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(FK.TABLE_NAME),
    ForeignKeyColumn = CU.COLUMN_NAME,
    UpdateRule = C.UPDATE_RULE,
    DeleteRule = C.DELETE_RULE
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON 
        C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME AND
        C.CONSTRAINT_CATALOG = FK.CONSTRAINT_CATALOG AND
        C.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON 
        C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME AND
        C.UNIQUE_CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG AND
        C.UNIQUE_CONSTRAINT_SCHEMA = PK.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON 
        C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME AND
        C.CONSTRAINT_CATALOG = CU.CONSTRAINT_CATALOG AND
        C.CONSTRAINT_SCHEMA = CU.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON 
        PK.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME AND
        PK.CONSTRAINT_CATALOG = CCU.CONSTRAINT_CATALOG AND
        PK.CONSTRAINT_SCHEMA = CCU.CONSTRAINT_SCHEMA
WHERE
    FK.CONSTRAINT_TYPE = 'FOREIGN KEY' AND
    PK.TABLE_NAME = @TableName
ORDER BY
    PK.TABLE_NAME, 
    FK.TABLE_NAME

Результаты:

CONSTRAINT_CATALOG  CONSTRAINT_SCHEMA   CONSTRAINT_NAME                 TABLE_CATALOG   TABLE_SCHEMA    TABLE_NAME  CONSTRAINT_TYPE     IS_DEFERRABLE   INITIALLY_DEFERRED
RS1                 dbo                 PK__PKTable__1EEFCD814EF90F36   RS1             dbo             PKTable     PRIMARY KEY         NO              NO
RS1                 dbo                 CK__PKTable__CheckVa__6DBA0403  RS1             dbo             PKTable     CHECK               NO              NO


ConstraintName                  PrimaryKeyTable     PrimaryKeyColumn    ForeignKeyTable     ForeignKeyColumn    UpdateRule  DeleteRule
FK__FKTable__FKColum__6FA24C75  [dbo].[PKTable]     PKColumn            [dbo].[FKTable]     FKColumn            NO ACTION   NO ACTION
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...