如何确定哪些表在 SQL Server 中使用序列

non*_*tag 5 sql-server sequence

我在 sys.sequences 中出现的 SQL Server 2012 数据库中有一个序列。如何确定哪些表使用此序列?我没有足够的权限来查看此系统视图的定义,因此无法四处寻找线索。

Geo*_*son 6

快速测试表明,序列引用是通过SQL Server 2014 SP2 中的sys.dm_sql_referencing_entities跟踪的。我无权访问 SQL Server 2012,但您可以使用以下查询(让管理员)确认它们是否也在 2012 年被跟踪。如果是这样,这可能会提供一种更严格的方法来查找您要查找的参考文献。

-- Find all objects that reference each sequence on the database
SELECT s.object_id AS sequence_object_id,
    s.name AS sequence_name,
    OBJECT_SCHEMA_NAME(o.parent_object_id) + '.'
        + OBJECT_NAME(o.parent_object_id) AS table_name,
    r.*
FROM sys.sequences s
CROSS APPLY sys.dm_sql_referencing_entities(
    OBJECT_SCHEMA_NAME(s.object_id) + '.' + s.name,
    'OBJECT'
) r
JOIN sys.objects o
    ON o.object_id = r.referencing_id
Run Code Online (Sandbox Code Playgroud)


Oll*_*lie 5

这将为您提供约束及其定义的列表,其中包含NEXT VALUE FOR,这意味着它们是一个序列。然后你可以在定义中看到序列名称。

SELECT OBJECT_NAME(c.object_id) TABLE_NAME,
       c.name COLUMN_NAME,
       dc.name CONSTRAINT_NAME,
       dc.definition [DEFINITION]
FROM sys.columns c
    INNER JOIN sys.default_constraints dc
        ON c.default_object_id = dc.object_id
WHERE dc.definition LIKE '%NEXT VALUE FOR%'
Run Code Online (Sandbox Code Playgroud)

您可以反转此操作以按序列名称进行搜索。

但是,如果您无权访问sys.sequences,则您不太可能访问上面的表。

我建议让管理员将精炼的代码放入具有权限的存储过程中,这样您就可以访问它而无需访问基础表。

我似乎找不到序列和约束或列之间的直接链接,定义是我能找到的唯一提及。我想这不是传统的关系,只是约束运行的代码块。