以编程方式授予对数据库的访问权限

Programmatically give access to databases

场景: 数据库课程的讲师希望每学期为 100 名学生中的每一个执行以下操作:(a) 从 windows 创建登录名,(b)为每个学生 db_owner 创建数据库,(c) 每个学生都可以读取数据库。 这是我目前的脚本:

DECLARE @DBname varchar(10) = 'aa1833'
DECLARE @Lname varchar(20) = 'STUDENTS'+'\'+@DBname

DECLARE @CreateDB varchar(max) = 'CREATE DATABASE '+@DBname
EXEC(@CreateDB)

DECLARE @CreateLogin varchar(max) = 'CREATE LOGIN ['+@Lname+ '] FROM WINDOWS'
EXEC(@CreateLogin)

USE sample_database
EXEC sp_addrolemember 'db_datareader', @Lname
EXEC sp_droprolemember 'db_owner', @Lname

DECLARE @dbRights varchar(max) = 'USE '+@DBname
EXEC(@dbRights)
EXEC sp_addrolemember 'db_owner', @Lname

如果能帮助解决以下问题,我将不胜感激:

  1. 以上脚本能够创建登录名和用户数据库。但是,访问权限(对单个数据库和示例数据库)不正确。
  2. 为了管理服务器 space,我想在每个学期结束时删除学生帐户及其数据库。我们可以使用 students\f21[=29=]1\aa1833 这样的数据库名称吗?
  3. 任何其他改进此设置的评论(学生无法访问他人的作品和编辑内容)将不胜感激。

SQL 服务器 15

动态 SQL USE 语句运行后,数据库上下文恢复到外部上下文 (sample_database),因此后续 sp_addrolemember 在 [=11= 中运行] 而不是预期的 aa1833

在同一个动态 SQL 批处理中执行 USEsp_addrolemember 以避免问题:

DECLARE @dbRights varchar(max) = 'USE ' + QUOTENAME(@DBname) + N';EXEC sp_addrolemember ''db_owner'', @Lname';
sp_executesql @dbRights, N'@Lname sysname', @Lname = @Lname;