-2

データベースを定義し、C# プログラムを使用してテーブルを作成しようとしています。私は SQL サーバーと SQL スクリプト ファイルを使用しており、一度に 1 つのステートメントを読み取って実行します。「GO」はステートメントの区切り文字です。基本的な手法は、ここと MSDN の回答で概説されているとおりです。SqlCommand と ExecuteNonQuery を介して DDL コマンドを送信します。

基本的には、ExecuteNonQuery を使用して SQL スクリプト ファイル内の各コマンドを処理しています。ただし、USE ステートメントについては、データベース名を解析してから、アプリの他の領域で使用する動作中の接続文字列にプラグインします。次に、SqlConnection を使用してそのデータベースに接続します。

スクリプトには、USE [マスター]、CREATE DATABASE、一連の ALTER が含まれており、その後に、作成したばかりのデータベースの USE が続きます。それが私が問題を抱えているところです。最初の USE は正常に機能し、データベースが作成され、各 ALTER ステートメントも正常に機能します。2 番目の USE ステートメントを実行すると、作成したばかりのデータベースに対して、指定したユーザー名でログインに失敗したことを示す SqlException が発生します。接続文字列からユーザーとパスワードを除外すると、同じ例外が発生し、ユーザー '' のログインに失敗したことが通知されます。ところで、2 番目の USE ステートメントを処理する前に、([master] への) 元の接続を閉じます。これは、新しいデータベースへの新しい接続を確立するつもりだからです。

スクリプトの次のステートメントは、新しく作成されたデータベースでユーザーを定義する CREATE USER です。接続できない場合はどうすればよいですか?あるいは、ユーザー、さらに重要なことにテーブルを定義できるように、その新しいデータベースにどのように接続すればよいのでしょうか。新しいデータベースでユーザーを定義することがそれほど重要かどうかはわかりませんが、テーブルを定義するためには間違いなく必要であり、そのデータベースに接続できない限り、それを行うことはできません.

何かご意見は?ここで明らかな何かが欠けているように感じますが、しばらくの間、この壁に頭を悩ませてきました。

4

1 に答える 1

0

OK、何よりもまず、接続を閉じる必要はありません。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 に答える