RSS

ASP.NET : IIS に発行したウェブアプリで SQL Server にアクセスできない件

Visual Studio で動作確認した ASP.NET ウェブアプリが IIS に発行した後、動作しなくなる現象があります。SQL Server 認証だといいんですが、Windows 認証では設定が必要です。

それは、web.config の設定の違いかユーザ権限の違いのためです。Visual Studio ではログインユーザの権限でウェブアプリも動作しますが、IIS では別の特殊なユーザ権限で動作します。

SQL Server 認証ならどちらのユーザで動いていても関係ないのですが、Windows 認証の場合は、ユーザが異なるのでログインできなくなります。

このユーザというのが最初 IUSR かと思っていたら、DefaultAppPool という偽装ユーザでした。ということで、Management Studio で、このユーザをデータベースのユーザに追加したらウェブアプリが動くようになりました。

このユーザは「検索」しても出てこないので直接入力します。

ただし、ただ登録するだけでなくスキーマの所有権も設定することを忘れないようにします。

defaultapppoolreg

defaultapppool

残念ながらこれだと、IIS と SQL Server が異なるサーバで動作している場合、うまく動作しません。その場合は、SQL Server が動作している DB サーバの有効なアカウントを IIS に設定してやらないと認証されません。(以下の設定を行うと上記の設定は使用されないので不要です)
まず、コンピュータの管理で「インターネッインフォメーションサービス」を選んで、ツリーの上の方にある「アプリケーションプール」をクリックします。

iis_defaultapppool

DefaultAppPool を選択してアプリケーションプールのプロパティ(右側のペイン)で「詳細設定」を実行します。プロセスモデルのIDをクリックするとボタン(…)が表示されるので、それをクリックします。

iis_defaultapppool_settings

ここにDB サーバの有効なアカウント情報を入力すると、IIS から DB サーバ上の SQL Server に Windows 認証で接続できるようになります。

iis_defaultapppool_custom

 
コメントする

投稿者: : 2016/12/11 投稿先 ASP.NET, Database

 

SQL Server でテーブル列の名前を変更するには

MySQL などでは ALTER TABLE でテーブル列の名前を変更できますが、SQL Server ではストアドプロシージャを使う必要があります。

(例) dbo.Users テーブルで列名 CreateDate をCreationDateに変更する。

USE [USER];
GO
EXEC sp_rename '[dbo].[Users].CreateDate', 'CreationDate', 'COLUMN';
GO
 
コメントする

投稿者: : 2016/12/11 投稿先 Database

 

LOAD DATA INFILE での注意点

MySQL の LOAD DATA INFILE コマンドで CSV ファイルをインポートする場合の注意点ですが、

  • テーブルの文字コードとCSVファイルの文字コードが合っているか?
  • CSVファイルの行の終端がLFか?(WindowsではデフォルトでCRLFになるので注意)
  • 特殊な文字があるとうまくいかない可能性がある。例えば、絵文字 など。
  • 文字コードを実行前に指定しておく。
  • 区切り文字や囲み文字の指定が必要か?

です。

使用例

mysql> SET character_set_database=UTF8;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> load data local infile '/home/user/temp/TABLE1.csv' 
into table TABLE1 fields terminated by ',';
Query OK, 104 rows affected, 10 warnings (0.07 sec)

FIELDS の指定例

FIELDS
    TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    ESCAPED BY ''
 
コメントする

投稿者: : 2016/11/22 投稿先 MySQL

 

sudo でパスワードを省略するには

sudo visudo を実行して sudoers に NOPASSWD 句を追加する。下にサンプルを示す。

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) NOPASSWD: ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
 
コメントする

投稿者: : 2016/10/25 投稿先 Linux

 

Ubuntu: apt でインストールできるパッケージ

次のコマンドを実行すると、apt でインストールできるパッケージの候補を表示できる。$1 はパッケージ名の一部である。

apt-cache search $1

(例) apt-cache search mysql

インストールされたパッケージの一覧は

dpkg -l

で表示できる。使われていないパッケージは

apt autoremove

で削除できる。

 

 

 

 
コメントする

投稿者: : 2016/10/24 投稿先 Linux

 

Perl: インストールされている Perl モジュール一覧を表示する。

つぎのスクリプトを実行すると、そのマシンにインストールされている Perl モジュール一覧を表示する。

find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print

 

 

 
コメントする

投稿者: : 2016/10/21 投稿先 Perl

 

Windows から画像をまとめて Linux へ転送したとき、紛れ込んだ Thumbs.db を削除するには

Windows では画像ファイルの置いてあるフォルダに隠しファイル thumbs.db というサムネイルのキャッシュを保存するファイルが作られる。

このフォルダごと Linux へ FTP 転送などを行うと、この隠しファイルが紛れ込んでしまう。次の ruby スクリプトは Linux に転送された Windows の画像フォルダを再帰的に検索して Windows の隠しファイルを削除する。

#  ディレクトリに含まれるすべての Desktop.ini, Thumbs.db を削除

def deleteKs(path)
  if FileTest.directory?(path) then  # ディレクトリかどうかを判別
    Dir.foreach(path) do |file|
      next if file == '.' or file == '..'  # 上位ディレクトリと自身を対象から外す
      deleteKs(path.sub(/\/+$/,"") + "/" + file)
    end
  else
    name = File.basename(path)
    if name == 'Desktop.ini' or name == 'Thumbs.db' then
      puts "deleting .. " + path
      File.delete(path)
    end
  end
end

# main
if ARGV.size > 0 then
  if FileTest.exists?(ARGV[0]) then
    deleteKs(ARGV[0])
    puts 'Done.'
  else
    puts ARGV[0] + ' does not exists.'
  end
else
  puts 'Usage: deleteKasu dir'
end
 
コメントする

投稿者: : 2016/10/20 投稿先 Linux, Ruby