我正在查看VS2010中的数据库项目,我的想法是我需要一些东西来跟踪数据库模式(在源代码管理中)以及生成“新安装”脚本和更改脚本的能力。
当我创建一个新的数据库项目向导并导入我现有的数据库模式时,它不会“构建”。我收到错误:
SQL03006:用户:[scanner]有一个 未解决的登录参考 [扫描器]。
生成此错误的SQL:
创建用户[scanner]登录 [扫描器];
用户“scanner”是我导入的数据库中定义的登录名。我不知道它给我带来了什么,谷歌也没有多大的投入。有什么想法吗?
答案 0 :(得分:16)
Login实际上是在服务器安装的master数据库中定义的。 CREATE USER语句需要指向现有的Login,否则会出错。数据库项目不知道服务器级别的登录。您可以创建服务器项目来处理登录,也可以关闭数据库项目中安全对象的检查。有关详细信息,请参阅Demetri M的答案:http://social.msdn.microsoft.com/Forums/eu/vstsdb/thread/1f8226fe-b791-4344-8735-3d38307e8664
答案 1 :(得分:8)
我正在将Visual Studio 2012用于SQL Server 2008 R2数据库项目。 @Judah列出的选项似乎不再起作用了。
现在,它们似乎是您在执行架构比较时配置的设置:
右键单击数据库项目> 选择“架构比较”> 选择“设置”齿轮图标> 选择“对象类型”标签>
登录是非应用程序范围的。数据库角色,权限,角色成员资格和用户都是应用程序范围的。
不幸的是,我能找到保留这些的唯一方法是保存模式比较。如果您在团队中共享此内容并且希望任何架构比较的项目/数据库(或服务器)设置,这可能会有点不方便。
但它完成了工作。
答案 2 :(得分:2)
您可以更改创建用户脚本以创建角色。 因此,而不是"为登录loginName创建用户userName;"
使用"创建角色[userName]授权dbo;"
这是一个黑客,但只要您不必处理项目中的用户和角色,您就可以愉快地执行以下操作:
GRANT EXECUTE ON OBJECT :: [dbo]。[sp_name] TO [userName];
答案 3 :(得分:0)
显然,这个问题在VS2017数据库项目中仍然存在。
我设法通过首先创建登录然后创建用户来解决它。
-- Windows Account
CREATE LOGIN [Domain\Username]
FROM WINDOWS WITH DEFAULT_LANGUAGE = [us_english];
GO
CREATE USER [Domain\Username] FOR LOGIN [Domain\Username];
GO
-- Sql Acccount
CREATE LOGIN [sql_account] WITH PASSWORD = 'Ch@ngeth1spA$swurD'
GO
CREATE USER [sql_account]
FROM LOGIN [sql_account]
WITH DEFAULT_SCHEMA = dbo
GO
-- Then set the sql file Build Action to "Build"