【问题标题】:LINQ to SQL Cannot create database [Schema Permissions]LINQ to SQL 无法创建数据库 [架构权限]
【发布时间】:2009-10-12 13:37:01
【问题描述】:

对于一些集成测试,我想使用 LINQ to SQL 删除/重新创建测试数据库。我以前工作得很好,但是在这个项目中,数据库被分成几个模式。

当我尝试运行 ctx.CreateDatabase() 命令时,我遇到了这个异常:

指定的模式名称“xyz”要么 不存在或您没有 使用它的权限。

我用来执行此操作的登录名角色为dbcreator - 是否需要进一步的权限?当然,具有创建数据库权限的登录名也应该能够创建该数据库中包含的所有内容?

更新:

由于使用 LINQtoSQL 似乎没有解决这个问题的方法,有没有人推荐任何类似的工具来生成最好是免费的数据库?理想情况下,我不想为手写 sql 构建脚本而烦恼。

【问题讨论】:

  • SQL Server Management Studio 可以编写整个数据库的脚本。右键单击数据库,选择任务,然后选择“生成脚本”。对于更多功能,您可能需要考虑商业解决方案,例如 SQL Compare red-gate.com/products/SQL_Compare/index.htm

标签: c# linq sql-server-2005 linq-to-sql integration-testing


【解决方案1】:

根据我的阅读,CreateDatabase() 方法在复制原始数据库方面受到限制。它不会重新创建触发器和检查约束之类的东西,我猜它也不会创建自定义模式。您可能需要考虑使用 SQL Server .mdf 文件创建数据库来解决此问题。有关 CreateDatabase() 的一些限制的更多详细信息,请参阅this blog entry

【讨论】:

    【解决方案2】:

    我通常在 NAnt 中做这种工作来创建、初始化数据库、创建用户、添加登录等等......以及回滚功能。如果您有兴趣,我已经写了很多关于这个主题的文章:

    Build automation with NAnt

    Continuous integration with CruiseControl.NET

    我将不得不看看我是否可以让 LINQ to SQL 以您尝试使用它的方式工作......这听起来就像我们过去使用 NHibernate 所做的那样。

    【讨论】:

      【解决方案3】:

      dbcreator 固定服务器角色授予您创建数据库的权限。如果您创建一个数据库,那么您就是该数据库的 dbo,并且作为 dbo,您在数据库中拥有绝对的权力,包括创建、更改和删除任何架构以及任何架构中包含的任何对象的权力。

      LINQ 的 CreateDatabase() 的问题不是权限,而是代码质量。生成的 SQL 代码根本没有创建所需的架构,因此创建表语句失败,因为架构不存在。

      如果您负担得起,您最好的选择是将VSTS Database Edition GDR R2 项目添加到您的解决方案中,并在数据库版项目(您的解决方案的一部分)中声明您的所有数据库对象。您还将获得将所有数据库对象存储在适当的源代码控制解决方案中的额外好处。数据库项目的输出将是一个包含数据库定义的 .dbschema 文件。在部署时(测试或实际),您将运行 VSDBCMD Deployment and Schema Import tool 将您的 .dbschema 导入目标服务器。该工具能够对您的架构进行初始部署,以及进一步升级(仅部署差异)。 VSDB 解决方案将允许您控制所有数据库对象:表、索引、视图、模式、字段约束、表约束、触发器、过程、用户、权限、登录等。它确实涵盖了所有可以在 SQL Server 中定义的对象。

      【讨论】:

        【解决方案4】:

        实际上 LINQ to SQL 确实支持模式,但不是每个 Sql Server 版本都支持。要启用CreateDatabase() 生成它们,DataContext 必须知道目标数据库确实支持它们。可以通过在DataContext上设置提供者来完成:

        [Provider(typeof(Sql2008Provider))]
        public class CustomDataContext : DataContext {
           ...
        }
        

        【讨论】:

          【解决方案5】:

          您的用户还需要db_dlladmin 用于该数据库。

          【讨论】:

          • 数据库可能不一定在任何给定时间存在,我无法将权限映射到它。
          【解决方案6】:

          我肯定会看一下实体框架,这些天我开始研究它。它是一个 OR/M,最能满足您的需求,并且在下一个版本发布后会更多。

          Entity Framework 也是 Microsoft 的创意成果,可在此处找到:http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx

          在 LINQ to SQL 和 LINQ to Entities 之间要记住的一点是,您是针对模型而不是数据库进行编程的。

          【讨论】:

            猜你喜欢
            • 2015-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-11
            • 1970-01-01
            • 2011-10-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多