以编程方式授予对数据库的访问权限
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
如果能帮助解决以下问题,我将不胜感激:
- 以上脚本能够创建登录名和用户数据库。但是,访问权限(对单个数据库和示例数据库)不正确。
- 为了管理服务器 space,我想在每个学期结束时删除学生帐户及其数据库。我们可以使用 students\f21[=29=]1\aa1833 这样的数据库名称吗?
- 任何其他改进此设置的评论(学生无法访问他人的作品和编辑内容)将不胜感激。
SQL 服务器 15
动态 SQL USE
语句运行后,数据库上下文恢复到外部上下文 (sample_database
),因此后续 sp_addrolemember
在 [=11= 中运行] 而不是预期的 aa1833
。
在同一个动态 SQL 批处理中执行 USE
和 sp_addrolemember
以避免问题:
DECLARE @dbRights varchar(max) = 'USE ' + QUOTENAME(@DBname) + N';EXEC sp_addrolemember ''db_owner'', @Lname';
sp_executesql @dbRights, N'@Lname sysname', @Lname = @Lname;
场景: 数据库课程的讲师希望每学期为 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
如果能帮助解决以下问题,我将不胜感激:
- 以上脚本能够创建登录名和用户数据库。但是,访问权限(对单个数据库和示例数据库)不正确。
- 为了管理服务器 space,我想在每个学期结束时删除学生帐户及其数据库。我们可以使用 students\f21[=29=]1\aa1833 这样的数据库名称吗?
- 任何其他改进此设置的评论(学生无法访问他人的作品和编辑内容)将不胜感激。
SQL 服务器 15
动态 SQL USE
语句运行后,数据库上下文恢复到外部上下文 (sample_database
),因此后续 sp_addrolemember
在 [=11= 中运行] 而不是预期的 aa1833
。
在同一个动态 SQL 批处理中执行 USE
和 sp_addrolemember
以避免问题:
DECLARE @dbRights varchar(max) = 'USE ' + QUOTENAME(@DBname) + N';EXEC sp_addrolemember ''db_owner'', @Lname';
sp_executesql @dbRights, N'@Lname sysname', @Lname = @Lname;