请求生成T-SQL脚本:创建指定Login、用户、库、架构及表并配置权限
T-SQL脚本实现指定创建操作
以下是可在SSMS中以sa身份执行的T-SQL脚本,满足所有要求并解决指定错误:
-- 1. 创建登录John(避免重复创建报错) IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'John') BEGIN CREATE LOGIN [John] WITH PASSWORD=N'12345', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF END GO -- 2. 创建数据库JohnDatabase,初始所有者设为John IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'JohnDatabase') BEGIN CREATE DATABASE [JohnDatabase] WITH OWNER = [John] END GO USE [JohnDatabase] GO -- 3. 创建架构JohnSchema IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'JohnSchema') BEGIN CREATE SCHEMA [JohnSchema] END GO -- 4. 创建数据库用户DbUser101,指定默认架构为JohnSchema IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'DbUser101') BEGIN CREATE USER [DbUser101] WITHOUT LOGIN WITH DEFAULT_SCHEMA=[JohnSchema] END GO -- 映射登录John到当前数据库用户(避免「登录名已存在对应账户」错误) IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'John' AND type_desc = 'SQL_USER') BEGIN CREATE USER [John] FOR LOGIN [John] WITH DEFAULT_SCHEMA=[dbo] END GO -- 调整权限:收回John的数据库所有者权限,仅授予指定表操作权限 ALTER AUTHORIZATION ON DATABASE::[JohnDatabase] TO [sa]; GRANT CREATE TABLE, SELECT, INSERT, UPDATE, DELETE ON SCHEMA::[JohnSchema] TO [John]; GO -- 5. 模拟John登录创建表JohnTable EXECUTE AS LOGIN = N'John'; GO IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = N'JohnTable' AND schema_id = SCHEMA_ID(N'JohnSchema')) BEGIN CREATE TABLE [JohnSchema].[JohnTable] ( ID INT PRIMARY KEY IDENTITY(1,1), Column1 NVARCHAR(50) NULL, Column2 INT NULL ) END GO REVERT; GO
关键说明
- 所有创建操作前加入
IF NOT EXISTS判断,避免重复创建引发的报错。 - 通过先将数据库所有者设为John再转回
sa,最后授予精准权限的方式,既满足“数据库归John所有”的要求,又限制John仅拥有表的创建、读写、修改权限,无额外权限。 - 创建数据库用户John时先检查是否已存在,解决「登录名已存在其他用户名对应的账户」错误,避免跨数据库用户映射冲突。
- 使用
EXECUTE AS LOGIN = 'John'模拟John身份创建表,贴合场景要求。
内容的提问来源于stack exchange,提问作者Gigi
相关产品推荐
相关产品推荐

