我正在使用SQL Server 2008 R2
。
最近我得到了一个包含网络应用程序实时数据的数据库。
通过查看它,我发现有许多表具有依赖性,即已经暗示但未声明。
例如:
TableA
列[Id], [Name], [Address]
。 [Id]
primary key
为TableB
[Id], [TableAId], [Salary]
列[Id]
。此处primary key
为[TableAId]
,列[TableA].[Id]
仅包含[TableB].[TableAId]
的值(除了TableA的Id之外没有任何值),但未将其声明为外键。
通过查看代码,我发现两个表的记录都插入到同一个事件中。因此[TableA].[Id]
列只包含{{1}}包含的值。
现在,我想找到像他们一样的其他依赖项。
是否可以使用SQL服务器查询,工具或任何第三方软件?
答案 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,则可以直接选择,更新或检索它们。
我希望这可能会有所帮助。 享受