幾十年來,我已經使用VIEW
S作爲同義詞:使用VIEW的Table或View有沒有同義詞的優點?
CREATE VIEW dbo.Banks AS
SELECT *
FROM OtherDatabase.dbo.Banks
我這樣做,所以我可以抽象其中「真正的」表。當它改變時,就像改變視圖一樣簡單:
而且這個效果很好。這不會導致優化器出現任何問題,並且我可以根據需要編輯視圖。
同義詞
與SQL Server 2005開始,微軟引入了同義詞:
CREATE SYNONYM dbo.Banks FOR OtherDatabase.dbo.Banks
它似乎工作相同到VIEW
方法。我看過的每個執行計劃的行爲都是相同的。
遺憾的是,似乎同義詞無法提供one of their basic functions, functionality i need:
提供了一個抽象層,它可以保護基礎對象的名稱或位置所做的更改客戶端應用程序
你無法改變同義詞所指的地方。由於沒有ALTER SYNONYM語句,因此首先必須刪除同義詞,然後重新創建具有相同名稱的同義詞,但將同義詞指向新位置。
他們有任何贖回質量?
實際上,這不會發生。我將永遠不會這樣做。我不會使用一種機制,要求我從數據庫中刪除對象以更改設置。我當然不會刪除所有容易改變的視圖,用SYNONYMs代替它們,並且必須向所有人解釋爲什麼使得一切變得更加困難的原因是「更好」。
所以我的問題是,有什麼我失去了使用意見?
- 每一個執行計劃看起來與同義詞
- 我可以很容易地改變「視圖同義詞」隨時
有沒有一種美德,以表或視圖的同義詞,我是失蹤?
不必調用
RefreshAllViews
的情況下,我忘了,我犯了一個表變化的地方
即使在貯存過程
除了
我甚至不使用同義詞存儲過程:
CREATE PROCEDURE dbo.GetUSDNoonRateAsOf @tradeDate datetime AS
EXECUTE OtherDatabase.dbo.GetUSDNoonRateAsOf @tradeDate
有沒有在我失蹤的同義詞的價值?
更新:RefreshAllViews過程
我們在每個數據庫的標準過程。對列進行重新排序或插入會對視圖造成嚴重破壞;所以他們必須是「刷新」。
CREATE PROCEDURE [dbo].[RefreshAllViews] AS
-- This sp will refresh all views in the catalog.
-- It enumerates all views, and runs sp_refreshview for each of them
SET NOCOUNT ON
DECLARE abc CURSOR FOR
SELECT TABLE_NAME AS ViewName
FROM INFORMATION_SCHEMA.VIEWS
ORDER BY newid()
OPEN abc
DECLARE @ViewName varchar(128)
--DECLARE @ParmDefinition NVARCHAR(500)
-- Build select string once
DECLARE @SQLString nvarchar(2048)
--SET @SQLString = N'EXECUTE sp_RefreshView @View'
--SET @ParmDefinition = N'@View nvarchar(128)'
FETCH NEXT FROM abc
INTO @ViewName
WHILE @@FETCH_STATUS = 0
BEGIN
IF @ViewName <> 'IndexServerNodes'
BEGIN
SET @SQLString = 'EXECUTE sp_RefreshView '[email protected]
PRINT @SQLString
EXECUTE sp_ExecuteSQL @SQLString--, @ParmDefinition, @View = @ViewName
END
FETCH NEXT FROM abc
INTO @ViewName
END
CLOSE abc
DEALLOCATE abc
天知道爲什麼SQL Server不能爲我做。
無法修改同義詞的問題是,無法從UI中更改它們。我不會記住語法。只有當我感覺1337時,我才能親手寫一個'CREATE INDEX';即使這樣,我也需要2或3次嘗試才能正確。 –
@這是一個非常糟糕的藉口恕我直言。與CREATE INDEX相比,CREATE SYNONYM的語法非常簡單。 'CREATE SYNONYM dbo.Something for SomeDatabase.dbo.SomethingElse;' - 這真的很難嗎? –
@IanBoyd懶惰不是不使用某些東西的真正原因。我也願意打賭,這使得你處於少數,因爲大多數嚴肅的SQL開發人員和DBA將所有內容都編寫爲可再生能力。如果我在我的部門發現了一個人使用GUI來處理所有事情,我會因爲A)而感到非常不安,而且B)它需要更長的時間才能完成。 – JNK