sp_fkeys (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';