Sql-Server

索引視圖引用兩個不同架構上的對象

  • March 25, 2022

當我嘗試創建/更改視圖以創建這樣的索引時

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

引用自:https://dba.stackexchange.com/questions/252263