Sql-Server
索引視圖引用兩個不同架構上的對象
當我嘗試創建/更改視圖以創建這樣的索引時
CREATE UNIQUE CLUSTERED INDEX IDX_vSalPopulation ON sfdc.vSalPopulation (ID);
我收到以下錯誤消息
消息 1938,級別 16,狀態 1,第 40 行索引無法在視圖“vSalPopulation”上創建,因為基礎對象“YR_TRM_SBTRM_TABLE”具有不同的所有者。
當我檢查表時,我發現這些表屬於不同的模式
exec sp_tables 'dbo.YR_TRM_SBTRM_TABLE' exec sp_tables 'vSalPopulation'
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS MyDB dbo YR_TRM_SBTRM_TABLE TABLE NULL MyDB sfdc vSalPopulation VIEW NULL
索引視圖的文件指出,您不能擁有引用兩個不同數據庫的索引視圖。
- 必須使用該
WITH SCHEMABINDING
選項創建視圖。- 視圖必須僅引用與視圖位於同一數據庫中的基表。
- 該視圖不能引用其他視圖。… ETC
但是,我有相同的數據庫,但有兩個不同的模式。也許問題實際上是第三個要求?雖然我沒有參考其他觀點,但有一些功能。也許我誤解了錯誤資訊。權限?那麼,一般來說,是否有可能有一個索引視圖來引用來自兩個不同模式的對象?
給我同樣錯誤的視圖的簡化定義如下所示
ALTER VIEW sfdc.vSalPopulation WITH SCHEMABINDING AS SELECT DISTINCT ID FROM dbo.CAN INNER JOIN dbo.YR_TRM_SBTRM_TABLE YTS ON CAN.YR_CDE = YTS.YR_CDE WHERE YTS.SBTRM_END_DTE > GETDATE()
我想我在這裡找到了答案。基本上,將我的第二個模式的授權授予 dbo:
ALTER AUTHORIZATION ON SCHEMA::sfdc TO dbo
因此,它確實與所有權/授權有關,而不是模式本身。請參閱:https ://www.sqlteam.com/articles/understanding-the-difference-between-owners-and-schemas-in-sql-server