我如何获取存储过程中使用的同义词列表
How do i get list of Synonyms were used in the stored procedure
我认为这是一个相当有效的问题,我不确定为什么它被标记为关闭,除非它也是重复的。
正如 Ben Thul 在他的评论中指出的那样:
One of the points of synonyms is to abstract the actual location of an
object so that you can change it in only one place (i.e. the synonym
definition) and anywhere the synonym is used automatically gets the
right location.
这当然是使用同义词的一个很好的理由(如果不是这个原因的话),但请考虑这样一种情况,您拥有作为唯一管理者继承的大型 SQL 代码库。您管理数据 table、视图和存储过程,并且在这个数据库中有近千个数据库对象。
有一天,(哎呀!)数据提要的更新破坏了内部流程。现在您的任务是检查任何损坏的代码并修复问题。经过一番搜索后,您发现 SP 中的 INSERT
引用似乎并未指向数据 table?因此,您假设它是一个同义词,您现在需要找到底层 table 以便您可以进一步检查可能损坏的内容。
这是一个有效的案例,事实上,这正是我今天的处境。原始海报比仅要求数据库对象同义词列表更进一步的逻辑需要。相反,他询问是否有一种方法可以列出一个存储过程中使用的所有同义词?
就我个人而言,我愿意列出所有同义词,但是,回答他的问题确实离最终需求更近了一步。
原始问题
谁能帮帮我,获取存储过程中使用的同义词列表(示例:Procs.myproc)
我相信你做不到。您唯一可以做的就是找到所有同义词的名称并在存储过程中找到这些字符串。
您可以通过以下查询获取所有同义词名称:
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 接 1 地检查存储过程中是否存在 "objectName"
我认为这是一个相当有效的问题,我不确定为什么它被标记为关闭,除非它也是重复的。
正如 Ben Thul 在他的评论中指出的那样:
One of the points of synonyms is to abstract the actual location of an object so that you can change it in only one place (i.e. the synonym definition) and anywhere the synonym is used automatically gets the right location.
这当然是使用同义词的一个很好的理由(如果不是这个原因的话),但请考虑这样一种情况,您拥有作为唯一管理者继承的大型 SQL 代码库。您管理数据 table、视图和存储过程,并且在这个数据库中有近千个数据库对象。
有一天,(哎呀!)数据提要的更新破坏了内部流程。现在您的任务是检查任何损坏的代码并修复问题。经过一番搜索后,您发现 SP 中的 INSERT
引用似乎并未指向数据 table?因此,您假设它是一个同义词,您现在需要找到底层 table 以便您可以进一步检查可能损坏的内容。
这是一个有效的案例,事实上,这正是我今天的处境。原始海报比仅要求数据库对象同义词列表更进一步的逻辑需要。相反,他询问是否有一种方法可以列出一个存储过程中使用的所有同义词?
就我个人而言,我愿意列出所有同义词,但是,回答他的问题确实离最终需求更近了一步。
原始问题
谁能帮帮我,获取存储过程中使用的同义词列表(示例:Procs.myproc)
我相信你做不到。您唯一可以做的就是找到所有同义词的名称并在存储过程中找到这些字符串。 您可以通过以下查询获取所有同义词名称:
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 接 1 地检查存储过程中是否存在 "objectName"