索引视图引用两个不同模式上的对象

wp7*_*8de 3 sql-server clustered-index materialized-view sql-server-2016

当我尝试创建/更改视图来创建这样的索引时

\n
CREATE UNIQUE CLUSTERED INDEX IDX_vSalPopulation\n   ON sfdc.vSalPopulation (ID);\n
Run Code Online (Sandbox Code Playgroud)\n

我收到以下错误消息

\n
\n

消息 1938,级别 16,状态 1,第 40 行 无法在视图\n\'vSalPopulation\' 上创建索引,因为基础对象 \'YR_TRM_SBTRM_TABLE\'\n 具有不同的所有者。

\n
\n

当我检查表时,我发现这些表由不同的模式拥有

\n
exec sp_tables \'dbo.YR_TRM_SBTRM_TABLE\'\nexec sp_tables \'vSalPopulation\'\n
Run Code Online (Sandbox Code Playgroud)\n
\n
TABLE_QUALIFIER     TABLE_OWNER       TABLE_NAME              TABLE_TYPE    REMARKS\nMyDB                dbo               YR_TRM_SBTRM_TABLE      TABLE         NULL \nMyDB                sfdc              vSalPopulation          VIEW          NULL\n
Run Code Online (Sandbox Code Playgroud)\n
\n

有关索引视图的文档指出,您不能拥有引用两个不同数据库的索引视图。

\n
    \n
  • 必须使用该WITH SCHEMABINDING选项创建视图。
  • \n
  • 该视图必须仅引用与该视图位于同一数据库中的基表。\n
  • \n
  • 该视图不能引用其他视图。\xe2\x80\xa6 等
  • \n
\n

但是,我有相同的数据库,但有两个不同的架构。也许问题实际上是第三个要求?虽然我没有引用其他视图,但还是有函数的。也许我误解了错误消息。权限?那么,一般来说,是否可以有一个索引视图来引用来自两个不同模式的对象?

\n

给我同样错误的视图的简化定义如下所示

\n
ALTER VIEW sfdc.vSalPopulation\n   WITH SCHEMABINDING \nAS\nSELECT DISTINCT\n    ID\nFROM dbo.CAN\nINNER JOIN dbo.YR_TRM_SBTRM_TABLE YTS ON CAN.YR_CDE = YTS.YR_CDE\nWHERE YTS.SBTRM_END_DTE > GETDATE()\n
Run Code Online (Sandbox Code Playgroud)\n

wp7*_*8de 5

我想我在这里找到了答案。基本上,将我的第二个架构的授权授予 dbo:

ALTER AUTHORIZATION ON SCHEMA::sfdc TO dbo
Run Code Online (Sandbox Code Playgroud)

因此,它确实与所有权/授权有关,而不是模式本身。请参阅: https: //www.sqlteam.com/articles/understanding-the-difference- Between-owners-and-schemas-in-sql-server