SQL Server查找未声明的表之间的依赖关系

时间:2013-09-20 07:28:50

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我正在使用SQL Server 2008 R2

最近我得到了一个包含网络应用程序实时数据的数据库。

通过查看它,我发现有许多表具有依赖性,即已经暗示但未声明。

例如:

TableA[Id], [Name], [Address][Id] primary keyTableB [Id], [TableAId], [Salary][Id]。此处primary key[TableAId],列[TableA].[Id]仅包含[TableB].[TableAId]的值(除了TableA的Id之外没有任何值),但未将其声明为外键。

通过查看代码,我发现两个表的记录都插入到同一个事件中。因此[TableA].[Id]列只包含{{1}}包含的值。

现在,我想找到像他们一样的其他依赖项。

是否可以使用SQL服务器查询,工具或任何第三方软件?

2 个答案:

答案 0 :(得分:0)

在一般情况下,我认为你不能指望TableA.Id暗示对TableA的外键引用。它可能指的是一个不同的表,存储表A中的id号。我知道你已经查看了这个特定情况下的代码,但您正在寻找一种不需要查看代码的解决方案。

无论如何。 。

您可以在表达式上连接表。此查询(PostgreSQL语法)将列名的一部分连接到表名。在PostgreSQL中,函数调用left(t1.column_name, -2)返回除t1.column_name的最后两个字符之外的所有字符; left(t1.column_name, -3)返回除最后三个之外的所有内容。这是为了匹配像“TableAid”和“TableA_id”这样的名称。

select t1.table_catalog, t1.table_schema, t1.table_name, 
       t1.column_name, left(t1.column_name, -2), 
       t2.table_catalog, t2.table_schema, t2.table_name
from information_schema.columns t1
inner join information_schema.tables t2
        on left(t1.column_name, -2) = t2.table_name or 
           left(t1.column_name, -3) = t2.table_name
where t1.column_name like '%id';

我相信这个查询会返回相同的行。它使用的是SQL Server语法,但我还没有在SQL Server中测试它。

select t1.table_catalog, t1.table_schema, t1.table_name, 
       t1.column_name, left(t1.column_name, length(t1.column_name) - 2), 
       t2.table_catalog, t2.table_schema, t2.table_name
from information_schema.columns t1
inner join information_schema.tables t2
        on left(t1.column_name, length(t1.column_name) - 2) = t2.table_name or 
           left(t1.column_name, length(t1.column_name) - 3) = t2.table_name
where t1.column_name like '%id';

这两个都可能错误地返回行,主要是因为连接可能至少需要考虑“table_catalog”列。我辩论是否要包括它。我终于决定不予理会。我想,如果我在你的鞋子里,我希望这个查询最有可能返回一些令人惊讶的行。

答案 1 :(得分:0)

尝试一些依赖性检查。

--- Get the source objects, columns and dependent objects using the data.
select so.name as sourceObj
     , so.type as sourceType
     , c.name  as colname
     , st.name as coltype
     , u.name  as DependentObj
     , d.selall   as is_select_all
     , d.resultobj as is_updated
     , d.readobj   as is_read
     --, d.*
  from sys.columns c 
     ----- object that owns the column
 inner join sys.objects so on so.object_id = c.object_id
 inner join sys.types st on c.system_type_id = st.system_type_id
     ----- holds dependencies
     inner join sysdepends d   on d.id = c.object_id
 ----- object that uses the column
 inner join sys.objects u on u.object_id = d.depid

您可以列出所有表/视图/过程等。对您的用例非常有用的位是:

     , d.sellall   as is_select_all
     , d.resultobj as is_updated
     , d.readobj   as is_read

如果这些字段中的任何一个具有1,则可以直接选择,更新或检索它们。

我希望这可能会有所帮助。 享受