我认为这是一个相当有效的问题,我不确定为什么它被标记为关闭,除非这也是重复。
正如Ben Thul在评论中指出的那样:
同义词的一个要点是抽象一个的实际位置 对象,以便您可以只在一个地方(即同义词)进行更改 定义)以及同义词自动使用的任何地方 正确的位置。
这肯定是同义词的一个很好的理由(如果不是原因),但考虑一个场景,你有一个大的SQL代码库,你继承作为唯一的经理。您可以管理数据表,视图和存储过程,并且在此数据库中有大约数千个数据库对象。
有一天,(哎呀!)数据Feed的更新会破坏内部流程。现在您的任务是检查任何损坏的代码并解决问题。经过一些搜索后,您会发现SP中的INSERT
引用似乎并未指向数据表?因此,您假设它是一个同义词,您现在需要找到基础表,以便您可以进一步检查可能被破坏的内容。
这是一个有效的案例,事实上,这正是我今天所处的位置。原始海报比仅仅询问数据库对象同义词列表更进一步。相反,他问是否有办法列出一个存储过程中使用的所有同义词?
就个人而言,我对所有同义词的列表都没问题,但回答他的问题确实更接近最终需要。
有人可以帮助我,在存储过程中使用同义词列表(例如:Procs.myproc)
答案 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"在存储过程中