三. 几点细节
当然,对于同义词的使用上也存在一些限制。对于初学者来说,你不能为任何东西都创建一个同义词。SQL Server 2005比以前引入了更多的对象,但是同义词仅限于应用于核心集的最有用的一些对象中:
· 表
· 视图
· 存储过程
· CLR存储过程
· CLR函数
· 复制过滤过程
· 扩展存储过程
· SQL标量,表值以及内联表值函数
关于在什么情况下使用同义词还存在一些限制。一般来说,你可以在下面这些T-SQL语句中使用一个同义词:
· SELECT
· sub-selects
· UPDATE
· INSERT
· DELETE
· EXECUTE
如果你仔细考虑一下,那么第二个表不应该太奇怪:它包含了最常用的where语句。注意,你不能在一个DDL语句中参考一个同义词。如果你想使用ALTER TABLE来改变ProductCategory表中的内容,那么,你需要使用基表而不是使用ProdCat同义词。
为了创建一个同义词,你需要CREATE SYNONYM权限。在创建一个同义词后,它就有了与其自己相关联的GRANT,DENY和REVOKE许可权。
四. 把同义词作为一个抽象层 除了节省你的输入时间外,同义词还可以用作你的数据库的不稳定的或经常更新部分的一个抽象层。这是因为同义词及其基对象之间的绑定仅在运行时刻检查,而不是在设计时刻。
为了说明这个问题,如果你重新定义ProdCat同义词,请研究下面发生什么情况:
DROP SYNONYM ProdCat CREATE SYNONYM ProdCat FOR AdventureWorks.Production.ProductCategory SELECT * FROM ProdCat DROP SYNONYM ProdCat CREATE SYNONYM ProdCat FOR AdventureWorks.Production.Culture SELECT * FROM ProdCat |
注意,当你任何时候想改变一个同义词时,你需要使用DROP和CREATE;不存在ALTER SYNONYM语句。图2显示出运行这个批处理语句的结果。
注意,在此,语句SELECT * FROM ProdCat与前面的第二次执行结果悬殊很大,因为同义词被重新定义以参考一个不同的表。
当然,你可以把这种行为应用于你自己的应用程序中。例如,假定你有一个程序,它需要分析来自于多种数据库的顾客数据。不是把基表与单个数据库连接起来或断开连接,或编写复杂的选择表格进行分析的SQL,而是使用同义词。定义一个同义词,例如DataTable,来参考你想使用的数据的四部分名字,并且重新定义它-无论何时你想要切换源数据。
当然,这种迟绑定也是一把双刃剑。因为SQL Server并不追踪是否一个同义词指向任何东西,它也不会进行任何模式绑定排序。如果你删除一个应用于另一个语句中的同义词,那么你可能直到试图运行该语句时才发现出了问题。
五. 小结 你能够开发自己的下一个SQL Server应用程序而不使用同义词吗?当然可以。它们并没有为数据库表带来根本性的新内容;你可以总是使用完全限定名字-在任何你想使用一个同义词的地方。但是有时把这些"小东西"加入到你的产品是一件不错的事情,就因为它们能够实现更少的输入和带给开发者一种更容易的体验。也许在一个应用程序的开发过程的某一阶段同义词将仅会节省你10分钟时间,但是所有这些小的10分钟相加应该是个不少的数目吧!
查看本文来源