sp_fkeys (Transact-SQL)

返回当前环境的逻辑外键信息。该过程显示各种外键关系,包括禁用的外键。

主题链接图标Transact-SQL 语法约定

语法

sp_fkeys [ @pktable_name = ] 'pktable_name' 
     [ , [ @pktable_owner = ] 'pktable_owner' ] 
     [ , [ @pktable_qualifier = ] 'pktable_qualifier' ] 
     { , [ @fktable_name = ] 'fktable_name' } 
     [ , [ @fktable_owner = ] 'fktable_owner' ] 
     [ , [ @fktable_qualifier = ] 'fktable_qualifier' ]

参数

  • [ @pktable_name=\] 'pktable_name'
    带主键的表的名称,用于返回目录信息。pktable_name 的数据类型为 sysname,默认值为 NULL。不支持通配符模式匹配。必须提供该参数或 fktable_name 参数,或二者都提供。

  • [ @pktable_owner=\] 'pktable_owner'
    表(带主键)的所有者的名称,用于返回目录信息。 pktable_owner 的数据类型为 sysname,默认值为 NULL。不支持通配符模式匹配。如果未指定 pktable_owner,则遵循基础 DBMS 的默认表可见性规则。

    在 SQL Server 中,如果当前用户拥有具有指定名称的表,则返回该表的列。如果未指定 pktable_owner,并且当前用户没有具有指定名称 pktable_name 的表,则此过程将查找由数据库所有者拥有并具有指定名称 pktable_name 的表。如果有,则返回该表的列。

  • [ @pktable_qualifier =] 'pktable_qualifier'
    表(带主键)限定符的名称。pktable_qualifier 的数据类型为 sysname,默认值为 NULL。许多 DBMS 产品都支持表的三部分构成命名方式 (qualifier.owner.name)。在 SQL Server 中,限定符表示数据库名称。在某些产品中,该列表示表所在数据库环境的服务器名。

  • [ @fktable_name=\] 'fktable_name'
    用于返回目录信息的表(带外键)的名称。fktable_name 的数据类型为 sysname,默认值为 NULL。不支持通配符模式匹配。必须提供该参数或 pktable_name 参数,或二者都提供。

  • [ @fktable_owner =] 'fktable_owner'
    用于返回目录信息的表(带外键)的所有者的名称。fktable_owner 的数据类型为 sysname,默认值为 NULL。不支持通配符模式匹配。如果未指定 fktable_owner,则遵循基础 DBMS 的默认表可见性规则。

    在 SQL Server 中,如果当前用户拥有具有指定名称的表,则返回该表的列。如果未指定 fktable_owner,并且当前用户没有具有指定名称 fktable_name 的表,则此过程将查找由数据库所有者拥有并具有指定名称 fktable_name 的表。如果有,则返回该表的列。

  • [ @fktable_qualifier= ] 'fktable_qualifier'
    表(带外键)限定符的名称。fktable_qualifier 的数据类型为 sysname,默认值为 NULL。在 SQL Server 中,限定符表示数据库名称。在某些产品中,该列表示表所在数据库环境的服务器名。

返回代码值

结果集

列名

数据类型

说明

PKTABLE_QUALIFIER

sysname

表限定符的名称(该表带主键)。该字段可以为 NULL。

PKTABLE_OWNER

sysname

表所有者的名称(该表带主键)。该字段始终返回值。

PKTABLE_NAME

sysname

包含主键的表的名称。该字段始终返回值。

PKCOLUMN_NAME

sysname

主键列的名称,针对返回的 TABLE_NAME 的每个列。该字段始终返回值。

FKTABLE_QUALIFIER

sysname

表限定符的名称(该表带外键)。该字段可以为 NULL。

FKTABLE_OWNER

sysname

表所有者的名称(该表带外键)。该字段始终返回值。

FKTABLE_NAME

sysname

包含外键的表的名称。该字段始终返回值。

FKCOLUMN_NAME

sysname

外键列的名称,针对返回的 TABLE_NAME 的每个列。该字段始终返回值。

KEY_SEQ

smallint

多列主键中列的序列号。该字段始终返回值。

UPDATE_RULE

smallint

当 SQL 操作是更新操作时应用于外键的操作。对于这些列,SQL Server 将返回 0 或 1:

0=对外键的 CASCADE 更改。

1=NO ACTION 更改(如果有外键)。

DELETE_RULE

smallint

当 SQL 操作是删除操作时应用于外键的操作。对于这些列,SQL Server 将返回 0 或 1:

0=对外键的 CASCADE 更改。

1=NO ACTION 更改(如果有外键)。

FK_NAME

sysname

外键标识符。如果不适用于数据源,则为 NULL。SQL Server 将返回 FOREIGN KEY 约束名称。

PK_NAME

sysname

主键标识符。如果不适用于数据源,则为 NULL。SQL Server 将返回 PRIMARY KEY 约束名称。

返回的结果集按FKTABLE_QUALIFIER、FKTABLE_OWNER、FKTABLE_NAME 以及 KEY_SEQ 排序。

注释

可以通过以下方法实现包含带禁用外键的表的应用程序编码:

  • 当使用这些表时,临时禁用约束检查(ALTER TABLE NOCHECK 或 CREATE TABLE NOT FOR REPLICATION),稍后再重新启用它。有关 NOT FOR REPLICATION 选项的详细信息,请参阅使用 NOT FOR REPLICATION 来控制约束、标识和触发器

  • 使用触发器或应用程序代码强制实施各种关系。

如果提供了主键表名,而外键表名为 NULL,则 sp_fkeys 将返回包含了给定表外键的所有表。如果提供了外键表名,而主键表名为 NULL,则 sp_fkeys 将返回通过主键/外键关系与外键表中的外键相关联的所有表。

sp_fkeys 存储过程与 ODBC 中的 SQLForeignKeys 功能相同。

权限

需要对架构的 SELECT 权限。

示例

以下示例将为 AdventureWorks2008R2 数据库中的 HumanResources.Department 表检索一个外键的列表。

USE AdventureWorks2008R2;
GO
EXEC sp_fkeys @pktable_name = N'Department'
    ,@pktable_owner = N'HumanResources';