Web アプリケーション ギャラリー用のアプリケーションのパッケージングに関するデータベース メモ

公開日: 2009 年 6 月 2 日 (作業者: stjacobs (英語))

更新日: 2009 年 10 月 21 日 (作業者: stjacobs (英語))

SQL 関連

MS SQL データベースへのアクセスを必要とするアプリケーションは、SQL Server とも SQL Express とも連携できます。Web Platform Installer では、このようなアプリケーションのインストールの際、ローカル コンピューターに SQL がインストールされているかどうかが確認されます。SQL が見つからなかった場合は、インストール コンポーネントの 1 つとして SQL Express が選択されます。リモート データベースを使用するユーザーは、SQL Express のオプションを選択解除できます。

SQL Express

ユーザーが SQL のインストールを要求した場合、またはアプリケーションで SQL が必要とされる場合、Web Platform Installer により SQL Server 2008 Express がインストールされます。WebPI では、SQL の認証モードとして、Windows ネイティブ認証またはデータベースに基づく認証を選択できます。多くのアプリケーションで使用されていることから、WebPI では、データベースに基づく認証を選択することを推奨します。データベース認証を選択したユーザーは 'sa' または管理ユーザー用のパスワードを入力する必要があります。このパスワードは、https://msdn.microsoft.com/ja-jp/library/ms143705.aspx に定められている要件を満たしている必要があります。SQL スクリプトによってデータベース ユーザーのパスワードを設定する場合についても、同じ要件が適用されます。既定のインストールでは、SQL Express サーバーが .\SQLEXPRESS というサービス名でセットアップされます。

以下の Install.SQL スクリプトは、パッケージング ガイドにあるパラメーター例と共に動作します。このスクリプトは、アプリケーションのデータベース用にユーザーを作成し、パスワードを設定します。また、ほとんどのアプリケーションで必要とされるすべての必要特権を設定します。

/**********************************************************************/
/* Install.SQL                                                        */
/* Creates a login and makes the user a member of db_owner            */
/*                                                                    */
/**********************************************************************/

-- Declare variables for database name, username and password
DECLARE @dbName sysname,
      @dbUser sysname,
      @dbPwd nvarchar(max);

-- Set variables for database name, username and password
SET @dbName = 'PlaceHolderForDb';
SET @dbUser = 'PlaceHolderForUser';
SET @dbPwd = 'PlaceHolderForPassword';

DECLARE @cmd nvarchar(max)

-- Create login
IF( SUSER_SID(@dbUser) is null )
BEGIN
    print '-- Creating login '
    SET @cmd = N'CREATE LOGIN ' + quotename(@dbUser) + N' WITH PASSWORD ='''+ replace(@dbPwd, '''', '''''') + N''''
    EXEC(@cmd)
END

-- Create database user and map to login
-- and add user to the datareader, datawriter, ddladmin and securityadmin roles
--
SET @cmd = N'USE ' + quotename(@DBName) + N'; 
IF( NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = ''' + replace(@dbUser, '''', '''''') + N'''))
BEGIN
    print ''-- Creating user'';
    CREATE USER ' + quotename(@dbUser) + N' FOR LOGIN ' + quotename(@dbUser) + N';
    print ''-- Adding user'';
    EXEC sp_addrolemember ''db_owner'', ''' + replace(@dbUser, '''', '''''') + N''';
END'
EXEC(@cmd)
GO

MySQL 関連

Web PI では、ユーザーのシステムに MySQL はインストールされません。アプリケーションで MySQL が必要な場合、WebPI ではローカル システムに MySQL が存在するかどうかが確認されます。MySQL が見つからなかった場合、WebPI では MySQL が必要である旨の警告が、MySQL の入手先のリンクと共に表示されます。

WebDeploy は、SQL と同じような方法で MySQL データベースとも連携します。SQL スクリプトには有効な MySQL 構文を含めることができます。以下の Install.sql スクリプトは、パッケージング ガイドにあるパラメーター例と共に動作します。このスクリプトは、アプリケーションのデータベース用にユーザーを作成し、パスワードを設定します。また、ほとんどのアプリケーションで必要とされるすべての特権を設定します。  

共有ホスティング環境では、スクリプト内の GRANT ステートメントの実行に必要な管理特権がエンド ユーザーに与えられていないことがほとんどです。ユーザーに GRANT ステートメントの実行許可がない場合、MySQL プロバイダーからエラーが返され、インストール プロセスは失敗します。このため、エンド ユーザーに GRANT の実行許可がない場合に起こるエラーを無視する add_user スクリプトを開発しました。このスクリプトにより、アプリケーションのインストール前にユーザーとデータベースの両方が作成される環境でも、インストールは正常に完了します。

MySQL 構文の通常のコマンド区切り文字はセミコロン (;) です。MySQL プロシージャでは、ステートメントの区切りにこれとは別の区切り文字が必要です。MySQL のドキュメント (英語) に、この説明があります。WebDeploy 用の区切り文字を指定するには、manifest.xml ファイルで dbMySQL プロバイダー ディレクティブの属性を次のように指定します。

<dbmysql path="install.sql" 
         commandDelimiter="//" 
         removeCommandDelimiter="true" /> 

使用するユーザー作成スクリプトも同様にしてパラメーター化できます。GRANT ステートメントのソースには 'localhost' を使用することに注意してください。ユーザーのほとんどはローカルでインストールを行うか、適切な GRANT ステートメントで作成されたデータベースとユーザーを使用します。したがって、'localhost' はサーバーのローカル ホストとみなします。アプリケーションをリモート データベースに対して実行する可能性が高い場合、つまりユーザーに完全な管理特権が与えられない場合は、例にある 'localhost' をパラメーターで置き換えることもできます。

USE PlaceHolderForDb;
 
DROP PROCEDURE IF EXISTS add_user ;
 
CREATE PROCEDURE add_user()
BEGIN
DECLARE EXIT HANDLER FOR 1044 BEGIN END;
DECLARE EXIT HANDLER FOR 1410 BEGIN END;
GRANT ALL PRIVILEGES ON PlaceHolderForDb.* to 'PlaceHolderForUser'@'localhost' IDENTIFIED BY 'PlaceHolderForPassword';
FLUSH PRIVILEGES;
END
//
 
CALL add_user() //
 
DROP PROCEDURE IF EXISTS add_user //