如何获取存储过程中使用的同义词列表

时间:2015-03-20 09:11:42

标签: sql-server stored-procedures

我认为这是一个相当有效的问题,我不确定为什么它被标记为关闭,除非这也是重复。

正如Ben Thul在评论中指出的那样:

  

同义词的一个要点是抽象一个的实际位置   对象,以便您可以只在一个地方(即同义词)进行更改   定义)以及同义词自动使用的任何地方   正确的位置。

这肯定是同义词的一个很好的理由(如果不是原因),但考虑一个场景,你有一个大的SQL代码库,你继承作为唯一的经理。您可以管理数据表,视图和存储过程,并且在此数据库中有大约数千个数据库对象。

有一天,(哎呀!)数据Feed的更新会破坏内部流程。现在您的任务是检查任何损坏的代码并解决问题。经过一些搜索后,您会发现SP中的INSERT引用似乎并未指向数据表?因此,您假设它是一个同义词,您现在需要找到基础表,以便您可以进一步检查可能被破坏的内容。

这是一个有效的案例,事实上,这正是我今天所处的位置。原始海报比仅仅询问数据库对象同义词列表更进一步。相反,他问是否有办法列出一个存储过程中使用的所有同义词?

就个人而言,我对所有同义词的列表都没问题,但回答他的问题确实更接近最终需要。

原始问题

有人可以帮助我,在存储过程中使用同义词列表(例如:Procs.myproc)

1 个答案:

答案 0 :(得分:1)

我相信你不能这样做。您唯一能做的就是找到所有同义词的名称,并在存储过程中找到这些字符串。 您可以通过以下查询获取所有同义词的名称:

SELECT

s.name, 
COALESCE(PARSENAME(s.base_object_name,4),@@servername) AS serverName, 
COALESCE(PARSENAME(s.base_object_name,3),DB_NAME(DB_ID())) AS dbName, 
COALESCE(PARSENAME(s.base_object_name,2),SCHEMA_NAME(SCHEMA_ID())) AS schemaName, 
PARSENAME(s.base_object_name,1) AS objectName 
FROM sys.synonyms s
ORDER BY 2,3,4,5

然后你循环逐步走1并检查存在" objectName"在存储过程中