-2

我正在尝试使用 C# 程序定义一个数据库并在其中创建一个表。我正在使用 SQL 服务器和一次读取并执行一条语句的 SQL 脚本文件,其中“GO”是语句分隔符。基本技术在此处和 MSDN 上的响应中概述 - 通过 SqlCommand 和 ExecuteNonQuery 提交 DDL 命令。

基本上,我正在使用 ExecuteNonQuery 处理 SQL 脚本文件中的每个命令。然而,对于 USE 语句,我解析出数据库名称,然后将其插入到我在应用程序的其他区域中使用的工作连接字符串中。然后我使用 SqlConnection 连接到该数据库。

该脚本包含一个 USE [master],然后是 CREATE DATABASE 和一堆 ALTER,然后是刚刚创建的数据库的 USE。这就是我遇到问题的地方。第一个 USE 工作正常,数据库已创建,每个 ALTER 语句也工作正常。当我点击第二个 USE 语句时,对于我刚刚成功创建的数据库,我收到一个 SqlException,告诉我我提供的用户名登录失败。如果我从连接字符串中删除用户名和密码,我只会得到相同的异常,告诉我用户''登录失败。顺便说一句,在我处理第二个 USE 语句之前,我关闭了原始连接(到 [master]),因为我打算为新数据库建立一个新连接。

脚本中的下一条语句是 CREATE USER,用于在新创建的数据库中定义用户。如果我无法连接到它,我该怎么做?或者问题是我如何连接到那个新数据库,以便我可以定义用户,更重要的是,表?我不确定在新数据库中定义用户是否那么重要,但定义表绝对是必需的,除非我可以连接到该数据库,否则我不能这样做。

有什么想法吗?我觉得我在这里遗漏了一些明显的东西,但我已经用头撞墙了一段时间了。

4

1 回答 1

0

好的,首先,您不需要关闭连接。USE [DatabaseName] 将切换上下文,您将在数据库上。

以下是以编程方式创建数据库和登录的脚本。但是,第一次运行时,系统必须使用您的 Windows 凭据来创建数据库。后续运行可以通过新的数据库用户执行。

USE [master]

SET QUOTED_IDENTIFIER ON

GO

--1. Create Database

IF EXISTS (SELECT name FROM sys.databases WHERE name = N'YourDatabase')
BEGIN
    ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    DROP DATABASE [YourDatabase]
END

/* Create Marketplace_v1_1 database.                                                          */
USE [master]
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE DATABASE "YourDatabase"  
GO
USE [master]
GO
ALTER DATABASE [YourDatabase] MODIFY FILE ( NAME = N'YourDatabase', FILEGROWTH = 10%)
GO


--2. Create Login/USer

USE [YourDatabase]
GO
IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'YourDatabaseUserName')
    DROP USER [YourDatabaseUserName]
GO

USE [master]
GO

IF  EXISTS (SELECT * FROM sys.server_principals WHERE name = N'YourDatabaseUserName')
    DROP LOGIN [YourDatabaseUserName]
GO  


CREATE LOGIN [YourDatabaseUserName] 
    WITH PASSWORD=N'YourPassword'
       , DEFAULT_DATABASE=[YourDatabase]
       , CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

USE [YourDatabase]
GO

--3. Grant Permission to your user, you can remove unecessary permissions depending on your requirements

--3.1 Permissions To read/write data to tables
CREATE USER [YourDatabaseUserName] FOR LOGIN [YourDatabaseUserName]
EXEC sp_addrolemember N'db_datareader', N'YourDatabaseUserName'
EXEC sp_addrolemember N'db_datawriter', N'YourDatabaseUserName'
GO

--3.2. Permissions to backup/restore database

EXEC master..sp_addsrvrolemember @loginame = N'YourDatabaseUserName', @rolename = N'bulkadmin'
GO
EXEC master..sp_addsrvrolemember @loginame = N'YourDatabaseUserName', @rolename = N'dbcreator'
GO
USE [YourDatabase]
GO
EXEC sp_addrolemember N'db_owner', N'YourDatabaseUserName'
GO
EXEC sys.sp_addsrvrolemember @loginame = N'YourDatabaseUserName', @rolename = N'processadmin'
GO
USE [YourDatabase]
GO
EXEC sp_addrolemember N'db_backupoperator', N'YourDatabaseUserName'
GO


--3.3. Grant permissions to operate on database objects
USE [YourDatabase]
GO
GRANT CREATE TABLE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT AUTHENTICATE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT BACKUP DATABASE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT BACKUP LOG TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CREATE FUNCTION TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CREATE PROCEDURE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CREATE TYPE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CREATE VIEW TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT DELETE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT EXECUTE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT INSERT TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT SELECT TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT UPDATE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT ALTER ON SCHEMA::dbo TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT REFERENCES TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT ALTER ANY ROLE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CONTROL TO [YourDatabaseUserName]
GO
于 2013-11-08T06:35:25.680 回答