2017-06-26 10 views
1

私は、教師の学生のデータベースの基礎をサポートするSQL 2016データベースサーバーを設定するオプションを検討しています。コースには200人近い学生がいます。MS SQLのバルクユーザーとデータベースの作成

スクリプトを使用してすべてのユーザーアカウントと関連データベースの作成を自動化したいと思います。つまり、各ユーザーのデータベースを同時に作成する必要があります。基本的に、各生徒のユーザーのログイン名とデータベースには生徒のIDが付けられます。ラボPCはADにないため、ログイン認証はSQL認証であり、Windowsではありません。

私が修正または使用できるスクリプトの指示に誰かが私を指摘することができれば、それは非常に役に立ちます - 基本的に私はこのルートを下っていくと毎年それをやる必要があります。

おかげ D.

+0

?動的SQLとカーソルを使用してそれらを作成する – dbajtr

+0

ログイン、パスワード、およびデータベース用の列を持つcsvまたはExcelシートから詳細を取り込むことができれば便利です。ユーザー名はログイン名と同じです。 – Defroster

+1

次に、CREATE USERコマンドに関連してpowershellを使用します。 –

答えて

0

して動的SQLを使用し、whileループ私たちすることができますループ生徒の名前を使用して、データベースを作成し、logins.Hopeは、それはあなたに役立ちます

IF OBJECT_ID('Tempdb..#USerTable') IS NOT NULL 
    DROP TABLE #USerTable 

IF OBJECT_ID('Tempdb..#USerNameINSERT') IS NOT NULL 
    DROP TABLE #USerNameINSERT 

IF OBJECT_ID('Tempdb..#PasswordsINSERT') IS NOT NULL 
    DROP TABLE #PasswordsINSERT 

--ADD Your student Names Passwords in a single line as below 
DECLARE @Usernames NVARCHAR(max) = 'Stud1,Stud2,Stud3,Stud4' 
    ,@Password NVARCHAR(max) = 'Password1,Password2,Password3,Password4' 
    ,@Usernameselect NVARCHAR(max) 
    ,@DatabaseNameselect NVARCHAR(max) 
    ,@PasswordSelect NVARCHAR(max) 
    ,@Usernameselect1 NVARCHAR(max) 
    ,@DatabaseNameselect1 NVARCHAR(max) 
    ,@PasswordSelect1 NVARCHAR(max) 


DECLARE @USerName TABLE (
    ID INT IDENTITY 
    ,Usernames NVARCHAR(max) 
    ,Passwords NVARCHAR(max) 
    ) 

INSERT INTO @USerName (
    UserNAmes 
    ,Passwords 
    ) 
SELECT @Usernames 
    ,@Password 


SELECT ID,UserNAmes INTO #USerNameINSERT 
FRom (
SELECT Row_number()Over(Order by (SELECT NULL)) AS ID,Split.a.value('.', 'VARCHAR(1000)') AS UserNAmes 
      FROM (
       SELECT ID, CAST('<S>' + REPLACE(UserNAmes, ',', '</S><S>') + '</S>' AS XML) AS UserNAmes 
       FROM @USerName 
       ) AS A 
      CROSS APPLY UserNAmes.nodes('/S') AS Split(a) 
      )DT 

SELECT ID,Passwords INTO #PasswordsINSERT 
FRom (
SELECT Row_number()Over(Order by (SELECT NULL)) AS ID,Split.a.value('.', 'VARCHAR(1000)') AS Passwords 
      FROM (
       SELECT CAST('<S>' + REPLACE(Passwords, ',', '</S><S>') + '</S>' AS XML) AS Passwords 
       FROM @USerName 
       ) AS A 
      CROSS APPLY Passwords.nodes('/S') AS Split(a) 

)DT 

SELECT u.ID 
    ,u.UserNAmes 
    ,u.UserNAmes+'Db' AS DatabaseName 
    ,p.Passwords 
INTO #USerTable 
FROM #USerNameINSERT u 
INNER JOIN #PasswordsINSERT p ON p.ID = u.ID 


DECLARE @minId INT 
    ,@maxId INT 
    ,@SqlQuery NVARCHAR(max) 
    ,@SqlQuery1 NVARCHAR(max) 
    ,@SqlQuery2 NVARCHAR(max) 

SELECT @minId = MIN(ID) 
    ,@maxId = Max(Id) 
FROM #USerTable 

WHILE (@minId <= @maxId) 
BEGIN 
    SELECT @Usernameselect = UserNAmes 
     ,@DatabaseNameselect = DatabaseName 
     ,@PasswordSelect = Passwords 
    FROM #USerTable 
    WHERE ID = @minId 

    SET @SqlQuery = 'CREATE DATABASE ' + @DatabaseNameselect 
    SET @SqlQuery1 = 'USE [' + @DatabaseNameselect + ']' 
    SET @SqlQuery2 = 'CREATE LOGIN ' + @Usernameselect + ' WITH PASSWORD=N''' + @PasswordSelect + ''' MUST_CHANGE, CHECK_EXPIRATION=ON, CHECK_POLICY=ON'+ CHAR(13) + CHAR(10) + 'GO' 
    SET @SqlQuery = ISNULL('', 'GO') + CHAR(13) + CHAR(10) + @SqlQuery 
        + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) + @SqlQuery1 
        + CHAR(13) + CHAR(10) + 'Go' + + CHAR(13) + CHAR(10) + @SqlQuery2 

    --EXEC (@SqlQuery) 

    PRINT @SqlQuery 

    SET @minId = @minId + 1 
END 
あなたが使用しようとしているものをユーザ名
+0

華麗!これをわずかに微調整してログインをマップし、データベースの役割を追加しました。データベースの作成中にMAXSIZEに追加されたすべての機能が有効でした。もう一度ありがとう:) – Defroster

+0

あなたは大歓迎です! UserNameとパスワードを追加するときに同じ数を入力する必要があることを確認してください –

0

使用すると、LOGINコマンドを作成します。 次の例では、ユーザーmyDBUserが作成されます。

USE [master] 
GO 
CREATE LOGIN [myDBUser] WITH PASSWORD=N'myPassword' MUST_CHANGE, DEFAULT_DATABASE=[myDB], CHECK_EXPIRATION=ON, CHECK_POLICY=ON 
GO 

そしてもちろんの

USE [myDB] 
GO 
CREATE USER myDBUser FOR LOGIN myDBUser; 
+0

レスポンスありがとうございましたMarek - 私は200人のユーザーのためにこれを自動化する必要があるので、csvやExcelシートなどのファイルからユーザーリストを取得するためには変数を使用する必要があり、各ユーザーに対してデータベースを同時に作成する必要があります。 – Defroster

+0

powershellを使って簡単に[csvからデータを読む](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/import-csv) –

+0

[データベースクエリ](https://technet.microsoft.com/en-us/library/hh289310.aspx)をご覧ください。 –

0

、ログイン用のDBユーザーを作成し、私はこのような何かが仕事だと思う、あなたはそのビットが一緒に投げとしてログイン周りの動的SQLのビットを変更する必要があるかもしれません。

--Create table for bulk insert 
Create Table UserNameCSV (UserID int, UserName Varchar(100)) 

--Insert login names from C:\csvtest.txt 
BULK 
INSERT UserNameCSV 
FROM 'c:\csvtest.txt' 
WITH 
(FIELDTERMINATOR = ',', ROWTERMINATOR = '\n') 
GO 

-- Run Cursor 
Declare @UserName Varchar(100) 

Declare db_Cursor CURSOR FAST_FORWARD FOR 
Select UserName from UserNameCSV 

OPEN db_Cursor 
FETCH NEXT FROM db_Cursor INTO @UserName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @UserName 
DECLARE @Sql1 varchar(max) = 'USE [' + @UserName + ']' 
DECLARE @Sql2 varchar(max) = 'CREATE LOGIN ' + @UserName + ' WITH PASSWORD=N''myPassword123!'' MUST_CHANGE, CHECK_EXPIRATION=ON, CHECK_POLICY=ON' 

EXECUTE(@Sql) 
EXECUTE (@Sql1) 
EXECUTE (@Sql2) 


FETCH NEXT FROM db_Cursor into @UserName 

END 

CLOSE db_Cursor 
DEALLOCATE db_Cursor 
+0

これをお試しいただきありがとうございますが、試してみましたが、csvの解析に問題がありました。 – Defroster

関連する問題