3

我有一台运行在本地PC上的SQL Server Express 2008 R2实例。如何在SQL Server Express 2008中创建新数据库并允许连接?

  • 身份验证“混合”这样我就可以登录使用Windows登录使用SQL Server身份验证。
  • TCP/IP启用
  • 远程连接被允许

  • 命名管道启用我采取了以下步骤来创建一个新的登录名和数据库:

    1. 我登录使用SQL Server Management Studio Express创建新登录
    2. 我使用新创建的登录名创建了一个新数据库作为所有者

    New login

    Login details

    New database

    Database security

    Database owner overview

    正如你在过去的截图中看到有一个用户名“dbo”,其中“属于”登录名“mylogin”。我尝试使用下面的连接字符串,但它不工作:

    Data Source=(local)\sqlexpress;Initial Catalog=newdb;User id=mylogin;Password=mypass

    错误日志在SQL Server Management Studio Express的状态:

    Login failed for user 'mylogin'. Reason: Failed to open the explicitly specified database. [CLIENT: xxx.xxx.x.xx]. Error: 18456, Severity: 14, State: 38

    如果我改变用户ID在连接字符串中报“DBO”以下错误:

    Login failed for user 'dbo'. Reason: Could not find a login matching the name provided. [Client: xxx.xxx.x.xx].

    我开始把真的疯了没有W上。我只是不知道如何访问任何数据库了...我的SQL Server实例是否损坏?

    只有当我尝试从我的ASP.NET应用程序进行连接时,才会出现此问题。使用SQL Server Management studio Express进行连接,使用提到的凭证DOES工作!

  • +0

    您是否尝试从Visual Studio服务器资源管理器创建与新数据库的连接?如果这是SQL服务器表达更好,您将数据库放在应用程序数据文件夹下,并将其附加到SQL Server Express – Damith

    +0

    是的,这是有效的。 – Ropstah

    +0

    因此,您有两个快速实例,一个是直接安装的,另一个是从Visual Studio中运行的问题?在Management Studio中连接时,SELECT @@ SERVERNAME会产生什么结果?如果它与您尝试从ASP.NET连接的不同,

    回答

    5
    1. 不要尝试将dbo映射到您的登录。 dbo是一个特殊用户。

    2. 要使用SQL身份验证连接到SQL Server,您需要通过登录名进入,而不是用户(让我们将Denali中包含的数据库从现在的讨论中退出)。所以你不应该试图在你的连接字符串中指定一个数据库用户(比如dbo)。我强烈建议创建一个登录名,然后在数据库级创建一个名称与登录名相同的用户 - 这比将login_foo映射到user_bar更容易混淆。我还建议远离用户或登录的特殊字词(例如dbo)。

    3. 我推荐学习设置这些东西所需的DDL和存储过程,并停止指向并单击UI。虽然用户界面在某些任务中可能看起来更快,但要重现您所做的完全相当困难,而且需要大量的工作量才能找出您在对话框中的选项卡上设置了哪些选项,你看。如果你使用脚本,你可以发布一个脚本,我们可以看到所有的脚本,而不用提出进一步的问题,你也可以保存脚本并引用它(这至少和你的记忆一样好,但几乎可以肯定更好)。

    以下是我将如何添加服务器登录,将它们作为用户放入newdb数据库,将它们添加到db_owner(而不是dbo)角色并将其默认数据库设置为newdb。打开Management Studio中新的查询窗口并连接到主,然后运行以下命令:

    USE [master]; 
    GO 
    CREATE LOGIN Ropstah_test WITH PASSWORD = 'secure password'; 
    GO 
    USE newdb; 
    GO 
    CREATE USER Ropstah_test FROM LOGIN Ropstah_test; 
    GO 
    EXEC sp_addrolemember 'db_owner', 'Ropstah_test'; 
    GO 
    USE [master]; 
    GO 
    ALTER LOGIN Ropstah_test WITH DEFAULT_DATABASE = newdb; 
    GO 
    

    现在从.NET连接字符串应该是这样的:

    Data Source=.\SQLEXPRESS;Initial Catalog=newdb;User ID=Ropstah_test;Password=secure password; 
    

    如果不工作,我会验证您的ASP.NET应用程序与SQL Express实例在同一台计算机上运行。 Web服务器也在你的机器上,对吧?不足之处在于,这应该起作用,如果它不起作用,还有其他一些不明显的变量。您不应该让用户成为实际的数据库所有者才能连接,但如果以上方法仍不能解决问题,请查看下面的脚本是否更改了行为或至少记录了日志中记录的错误消息:

    USE newdb; 
    GO 
    DROP USER Ropstah_test; 
    GO 
    USE [master]; 
    GO 
    ALTER AUTHORIZATION ON DATABASE::newdb TO Ropstah_test; 
    

    这将用户从数据库中删除,然后将它们重新添加为官方所有者(这与db_owner角色不同,它本质上只是授予模板权限的简写)。这不应该是必要的,但它可能有助于隔离为什么你不能使这个通常简单的过程工作。

    +0

    感谢您的详细解释!我很欣赏这一点。 – Ropstah

    相关问题