sp_fkeys (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的仓库

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

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 中,如果当前用户拥有具有指定 name 的表,则返回该表的列。 如果未指定 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 中,如果当前用户拥有具有指定 name 的表,则返回该表的列。 如果未指定 fktable_owner,且当前用户未拥有指定 fktable_owner 的表,则该过程查找由数据库所有者拥有的具有指定 fktable_owner 的表。 如果有,则返回该表的列。

[ @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 操作是更新操作时应用于外键的操作。 可能的值:
0=对外键的 CASCADE 更改。
1=NO ACTION 更改(如果有外键)。
2 = 设置 null
3 = 设置为默认值
DELETE_RULE smallint 当 SQL 操作是删除操作时应用于外键的操作。 可能的值:
0=对外键的 CASCADE 更改。
1=NO ACTION 更改(如果有外键)。
2 = 设置 null
3 = 设置为默认值
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),稍后再重新启用它。

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

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

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

权限

需要对架构的 SELECT 权限。

示例

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

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

示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

以下示例将为 DimDate 数据库中的 AdventureWorksPDW2012 表检索一个外键的列表。 不返回任何行,因为 Azure Synapse Analytics 不支持外键。

EXEC sp_fkeys @pktable_name = N'DimDate';  

另请参阅

目录存储过程 (Transact-SQL)
系统存储过程 (Transact-SQL)
sp_pkeys (Transact-SQL)