在C#中以编程方式创建数据库并定义表

时间:2013-11-08 05:55:00

标签: c# sql sql-server database

我尝试使用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,用于在新创建的数据库中定义用户。如果我无法连接,我该怎么办?或者问题是如何连接到新数据库以便我可以定义用户,更重要的是,可以定义表格?我不确定在新数据库中定义用户是否非常重要,但是对于表格的定义肯定是必需的,我可以'除非我可以连接到该数据库,否则请执行此操作。

有什么想法?我觉得我在这里遗漏了一些明显的东西,但我现在已经在这堵墙上打了一会儿。

1 个答案:

答案 0 :(得分: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