Transact-SQL 参考

sp_fkeys

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

语法

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 默认的表可视性规则。

在 Microsoft® 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 varchar(32) 外键列的名称,针对返回的 TABLE_NAME 的每个列。该字段始终返回值。
KEY_SEQ smallint 多列主键中列的序列号。该字段始终返回值。
UPDATE_RULE smallint 当 SQL 操作是更新时,应用于外键的动作。SQL Server 为这些列返回 0 或 1。开放数据服务网关可返回值 0、1 或 2:

0= 对外键的 CASCADE 修改。
1= 如果有外键,那么进行 NO ACTION 修改。
2=SET_NULL;将外键设置为 NULL。

DELETE_RULE smallint 当 SQL 操作是删除时,应用于外键的动作。SQL Server 为这些列返回 0 或 1。开放数据服务网关可返回值 0、1 或 2:

0= 对外键的 CASCADE 修改。
1= 如果有外键,那么进行 NO ACTION 修改。
2=SET_NULL;将外键设置为 NULL。

FK_NAME sysname 外键标识符。如果对数据源不可用,则其为 NULL。SQL Server 返回 FOREIGN KEY 约束名。
PK_NAME sysname 主键标识符。如果对数据源不可用,则其为 NULL。SQL Server 返回 PRIMARY KEY 约束名。

返回的结果集按 FKTABLE_QUALIFIERFKTABLE_OWNERFKTABLE_NAMEKEY_SEQ 排序。

注释

如果应用程序编码中包含某些表,而这些表带有禁用的外键,那么可以通过如下方法实现应用程序编码:

  1. 当使用这些表时,临时禁用限制检查(ALTER TABLE NOCHECK 或 CREATE TABLE NOT FOR REPLICATION),稍后再重新启用它。

  2. 使用触发器或应用程序代码强制实施关系。

如果提供了主键表名,而外键表名为 NULL,那么 sp_fkeys 将返回所有这样的表:该表包含指向给定的表的外键。如果提供了外键表名,而主键表名为 NULL,那么 sp_fkeys 将返回所有这样的表:该表通过主键/外键关系与外键表中的外键相关联。

sp_fkeys 存储过程等价于 ODBC 中的 SQLForeignKeys

权限

执行权限默认授予 public 角色。

示例

下面的示例为 Northwind 数据库中的 Customers 表检索一个外键的列表。

USE Northwind
EXEC sp_fkeys @pktable_name = N'Customers'

请参见

sp_pkeys