回答:
状態コードとその意味。
1 'Account is locked out'
2 'User id is not valid'
3-4 'Undocumented'
5 'User id is not valid'
6 'Undocumented'
7 'The login being used is disabled'
8 'Incorrect password'
9 'Invalid password'
10 'Related to a SQL login being bound to Windows domain password policy enforcement.
See KB925744.'
11-12 'Login valid but server access failed'
16 'Login valid, but not permissioned to use the target database'
18 'Password expired'
27 'Initial database could not be found'
38 'Login valid but database unavailable (or login not permissioned)'
より詳細な情報は、Aaron Bertrandのブログにあります。
状態38の18456もありました。接続文字列に 'integrated security = true'が含まれていることがわかりましたが、これは私が望んでいたものではありませんでした。接続文字列には、使用されるユーザーIDとパスワードが含まれていました。設定をfalseに変更したとき、すべては順調でした。
@Pete Oaklyは、状態コードのリストで正しい道を進んでいます。具体的には、これは私たち全員が興味を持っているコードです。
38 'ログインは有効だが、データベースが利用できない(またはログインが許可されていない)'
私の問題はC#エラーログで始まりました。
Exception | PublishedException | 000161 | 10/29/2018 | 11:06:40.210 | 16284 | InnerException |ログインで要求されたデータベース「InterestingDataBaseName」を開けません。ログインに失敗しました。ユーザー 'CORP \ anyuser'のログインに失敗しました。
私の目は「ログイン失敗」の部分に集中していました。私のユーザーはこのDBサーバーのsaでしたが、ログインが失敗する可能性はありますか?
私は答えを持っていたプログラマーのトリオによってこの投稿につまずきました:https : //justaprogrammer.net/2012/12/09/a-misleading-sql-error-message-error-18456-severity-14-state-38 /
それ自体がログイン失敗ではなく、私がアクセスしようとしているのはデータベースです。 それは存在しません!
ビンゴ!他の理由でデータベース名を変更しましたが、構成ファイルを更新しませんでした。DB名を修正し、物事が再びチャームのように機能するようになりました。
私たちの場合、SQL Server構成マネージャーで| SQL Serverネットワーク構成| TCP / IP | IP | TCPポートでしたありません設定さ。
ODBC接続を確立できず、リモートのSQL Management Studio接続を使用して、ユーザーでログインすることさえできませんでした。ただし、TomcatアプリケーションのURLにアクセスするたびにjdbc接続を起動し、SQL Serverログにエラーを発見しました:ユーザー 'xxxx'のログインに失敗しました:reason明示的に定義されたデータベースを開くことができませんでした、エラー18456、重大度14 、状態38
ここで、jdbc接続文字列の要約
"jdbc:sqlserver://10.10.10.10:1433;databaseName=zzzzzzz" username="yyyyyy" password="xxxxxx" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" defaultAutoCommit="true"/>
<Resource name="jdbc/application"
これは、SQL Serverネットワーク構成でも言うことができます| <インスタンス名>のプロトコル| 名前付きパイプを有効にし、パイプ名 \\.\pipe\MSSQL$<instance name>\sql\query
を正しく設定する必要があります。
さて、これはデータベースのアクセス許可関連のエラーです。DBAの役割を理解することが非常に重要であるため、この質問にソリューションを追加しています。だから、私の提案があります:
次に、そのユーザー名でログインすると、ユーザーにアクセスを許可できます。そうするには:
[ セキュリティ ]に移動し、[ ログイン ]を右クリックして[ 新しいログイン ] を選択します
ログインウィンドウで、ユーザー名を入力または検索できます。リストからユーザーを選択してクリックし、[OK]と[OK]をもう一度。
同じログインウィンドウで、[ サーバーロール ]をクリックし、sysadmin、serveradmin、decreatorなどの選択したユーザーにアクセスを許可します。OKをクリックします。
個々のデータベースへのアクセスを許可する場合は、ユーザーマッピングに移動し、要件に従ってアクセスを提供します。
データベースの状態をチェック: 許可:グラント ログイン:有効
OKをクリック