如何创建可以访问“master”数据库的用户

Chi*_*hin 5 sql-server

最近我创建了一个位于Database > System Databases > master > Tables > my_table. (参考下图)

现在我想创建一个可以访问此表的用户,但不知道它是如何工作的。(我想用 C# 连接到这个表)

在此处输入图片说明

Joh*_* N. 5

建议

\n\n

用户对象不应存储在主数据库中,如以下文章所述。

\n\n
\n\n

主数据库中的表(BrentOzar.com)

\n\n
\n

master 数据库是一个系统数据库 \xe2\x80\x93 它 \xe2\x80\x99s 并不是真正供您浏览和存储内容的。我们通常为主数据库而不是用户数据库设计不同的备份和恢复过程。

\n
\n\n

主数据库以简单恢复模式运行,因此如果数据库损坏,则无法恢复到某个时间点。

\n\n
\n\n

SQL Server\xe2\x80\x9cmaster\xe2\x80\x9d数据库中的表,会引起问题吗?(服务器故障.com)

\n\n
\n

我建议迁移到专用数据库。以下是几个原因:

\n\n
    \n
  • 如果您想要将此数据库迁移到 SQL Server 的其他实例,您无论如何都需要执行此操作。您无法迁移 master。
  • \n
  • 主数据库不适用于用户数据。它旨在成为保持实例功能所需的数据和代码的中心点。在 master 中添加东西会使那里的水变得浑浊。
  • \n
  • 将内容添加到 master 需要不必要地更改 master 中的安全性。
  • \n
\n
\n\n
\n\n

主数据库(Microsoft TechNet)

\n\n
\n

使用 master 数据库时,请考虑以下建议:

\n\n
    \n
  • 始终拥有可用的主数据库的当前备份。
  • \n
  • 进行以下操作后请尽快备份master数据库:\n \n
      \n
    • 创建、修改或删除任何数据库
    • \n
    • 更改服务器或数据库配置值
    • \n
    • 修改或添加登录帐户
    • \n
  • \n
  • 不要在 master 中创建用户对象。否则,必须更频繁地备份 master。\n 不要将 master 数据库的 TRUSTWORTHY 选项设置为 ON。
  • \n
\n
\n\n
\n\n

反而

\n\n

考虑为您的应用程序创建一个用户数据库(例如My_App)。

\n\n
CREATE DATABASE [My_App]\n CONTAINMENT = NONE\n ON  PRIMARY \n( NAME = N\'My_App\', FILENAME = N\'E:\\DATA\\My_App.mdf\' , SIZE = 131072KB , FILEGROWTH = 16384KB )\n LOG ON \n( NAME = N\'My_App_log\', FILENAME = N\'F:\\LOGS\\My_App_log.ldf\' , SIZE = 65536KB , FILEGROWTH = 16384KB )\nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后为您的数据库创建一个管理用户(例如My_App_DBO):

\n\n
USE [master]\nGO\nCREATE LOGIN [My_App_DBO] WITH PASSWORD=N\'P@ssw0rd\', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON\nGO\nUSE [My_App]\nGO\nCREATE USER [My_App_DBO] FOR LOGIN [My_App_DBO]\nGO\nUSE [My_App]\nGO\nALTER USER [My_App_DBO] WITH DEFAULT_SCHEMA=[dbo]\nGO\nUSE [My_App]\nGO\nALTER ROLE [db_owner] ADD MEMBER [My_App_DBO]\nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

该用户将在您的新数据库上拥有db_owner角色,并且可以对您的新数据库执行 DDL 和 DML 语句。

\n\n
\n

db_owner 固定数据库角色的成员可以对数据库执行所有配置和维护活动。

\n
\n\n

现在,您可以使用 SQL Server 登录名My_App_DBO在新的My_App数据库中创建表。

\n\n

完成数据库配置后,请考虑添加一个不具有 db_owner 角色的新用户,以减少不需要的 DDL 语句的责任。

\n\n

创建一个仅具有db_datareaderdb_datawriter权限的新用户(例如My_App_USER)。

\n\n
USE [master]\nGO\nCREATE LOGIN [My_App_USER] WITH PASSWORD=N\'P@ssw0rd\', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON\nGO\nUSE [My_App]\nGO\nCREATE USER [My_App_USER] FOR LOGIN [My_App_USER]\nGO\nUSE [My_App]\nGO\nALTER USER [My_App_USER] WITH DEFAULT_SCHEMA=[dbo]\nGO\nUSE [My_App]\nGO\nALTER ROLE [db_datareader] ADD MEMBER [My_App_USER]\nGO\nUSE [My_App]\nGO\nALTER ROLE [db_datawriter] ADD MEMBER [My_App_USER]\nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

具有 db_datawriter 角色的 SQL Server 登录名可以:

\n\n
\n

db_datawriter 固定数据库角色的成员可以添加、删除或更改所有用户表中的数据。

\n
\n\n

具有 db_datareader 角色的 SQL Server 登录名可以:

\n\n
\n

db_datareader 固定数据库角色的成员可以对数据库中的任何表或视图运行 SELECT 语句。

\n
\n\n

然后从那里开始。

\n\n
    \n
  • 您可以将 Windows 域用户指定为 SQL 登录名,而不是使用 SQL Server 登录名。
  • \n
  • 您还可以改变为每个单独登录创建的每个用户对象的访问级别。
  • \n
\n\n

这只是一个小小的起点,应该能让您大致了解如何将内容排除在主数据库之外。

\n\n

并始终确保在运行脚本来创建对象时位于数据库上:

\n\n
USE My_App\n
Run Code Online (Sandbox Code Playgroud)\n\n

祝你好运。

\n