【问题标题】:Why are system views duplicated to user databases?为什么系统视图会复制到用户数据库?
【发布时间】:2010-10-02 10:51:30
【问题描述】:

为什么 SQL Server 要将模型数据库中的一百个系统视图复制到每个用户定义的数据库中,而不是让它们保持集中(例如,因为它保持服务器对象)并在被询问时在特定数据库的特定上下文中使用它们/需要吗?

它们(例如,系统视图的定义/脚本)在数据库之间不是通用的吗?


更新:

我还是没弄明白:
1)
为了在另一个数据库的上下文中执行视图,无需将视图定义复制到每个数据库中(只需提取视图定义并在特定数据库的上下文中执行)。
那么,为什么要复制副本呢?
2)
那么,我还是很困惑什么存储在哪里?

[1] (BOL2005[1a]-2008R2[1b]) 告诉我们:

“在 SQL Server 中,系统对象不再存储在主数据库中;而是存储在资源数据库中

另外,我想了解为什么 SSMS 允许编写服务器对象脚本(例如,在服务器对象下的对象资源管理器中单击鼠标右键 --> syspolicy_server_trigger 上的触发器 --> 将服务器触发器脚本编写为 ...--- > ) 而,例如,系统视图没有这种可能性。

是什么让它们与众不同?它们分别存储在哪里?


引用:
[1] 主数据库
[1a]
(SQL Server 2008 R2 联机丛书)
http://msdn.microsoft.com/en-us/library/ms187837.aspx
[1b]
(SQL Server 2005 联机丛书)
http://msdn.microsoft.com/en-us/library/ms187837(v=SQL.90).aspx

【问题讨论】:

    标签: sql-server architecture configuration terminology code-reuse


    【解决方案1】:

    它们没有重复。

    • sys.objects 和 sys.database_principals 被存储,因为它们是特定于数据库的
    • sys.server_triggers 或 sys.server_permissions 仅存在于主数据库中的服务器级别

    SQL Server 根据需要将 sys 架构正确解析为数据库或服务器:

    USE MyDB
    GO
    SELECT * FROM sys.server_permissions   --   <. always from master db 
    

    那么简单,在实际的日常层面上毫无用处......

    编辑:在 Martin Smith 发表评论后,from MSDN

    【讨论】:

    • 我认为实际上来自mssqlsystemresource而不是master
    • @Martin Smith:公共目录视图位于主目录中,内部隐藏的 位于无法访问的 mssqlsystemresource 中。实际上它的主人。与 SQL Server 2000 和之前的 SQL Server 2000 不同,它确实在 master 中有表
    • 我复制了 mssqlsystemresource 的 mdf 并将其作为新数据库附加。 sys.server_permissions 在该副本中显示为用户视图。
    • @Martin Smith:它仍然是有效的大师,因为你不能使用资源数据库。注意这里变成用户视图而不是系统视图
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多