SQLserver 突然ダイヤグラムが使えなくなった。

ダイヤグラムをひらこうとすると、下記のエラーがでてリレーションが組めません。
さらに、既に組んでいたリレーションも見ることができません。

データベース プリシパルとして実行できません。プリシパル”dbo”が存在しないか、この種類のプリシパルで権限を信用できないか、ユーザーに権限がありません。(Microsoft SQL server、エラー:15517)

どうしたらいいものか!?費やす時間5時間。

クエリで下記のコマンドを実行して回避した。

exec sp_changedbowner ‘sa’

このコマンドの説明は、データベース所有者 (dbo) が不明なユーザーとして表示されている場合は、ユーザー データベースで次のコードを実行します。とのこと。

なおったのでよかった。

Access 閉じるときにパスワードを求められる

SQLserverとAccessの組み合わせにて、終了するときに、パスワードを求められるようになった。

毎回面倒なので、調べると、閉じるときに最適化のオプションを外すと直った。

SQLserver MSSM ダイヤグラムが突然開けない。

メッセージ 15517
データベース プリンシパルとして実行できません。プリンシパル “dbo” が存在しないか、この種類のプリンシパルで権限を借用できないか、ユーザーに権限がありません。

突然、ダイヤグラムを開こうとしたらエラーがでて変更ができない。
データベースの所有者を確認する必要があるとか。

移行先でデータベースを復元(リストア)した後は、データベースの所有者が設定されていることを確認しておくようにします。移行元で、データベースの所有者が Active Directory ドメインのユーザーになっていて、移行先でも同じドメインに参加している場合であれば、そのユーザーが引き続きデータベースの所有者に設定されるのですが、異なるドメインや、ワークグループ環境へ復元した場合や、Windows のローカル ユーザーが所有者になっている場合は、復元後にデータベースの所有者が「空」に設定されてしまいます。

データベースからの右クリック>>プロパティ>>ファイル>>所有者

ここに、所有者を選択していれれば、回避できる。
いろいろとあるものだ。

参考ページ:http://www.sqlquality.com/ex2014/UpgradeTo2014_ex/Text/Step05-09.html

SQLserver データベースのリストア 元の環境復元

お客様のところと同じ環境で自分のところにも残しておき、修正が発生したときに簡単に検証できるようにしたいということで記載する。

以前、お客の環境で作成したアクセスとSQLserverとの接続をしたときに、全部、リンクテーブルを張り直ししてやったのが、どうも腑に落ちなかった。ODBCを調べてみると

ODBC;DSN=abcdefg;UID=xxxconect;PWD=xxxxxxx;DATABASE=dataxxx;LANGUAGE=日本語;

ODBC;DSN=bbccddefg;UID=xxxconect;PWD=xxxxxxx;DATABASE=dataxxx;LANGUAGE=日本語;

あ~~~~ただ単にネーミングが違うという初歩的ミス。結論は、アクセスの方のリンクテーブルなどは張り返す必要はなかったという事だ。

さて、本題

まずマシンを準備してあり、SQLEXPRESSもインストールしてあった。
(1)マシンのネーミングを変更する。※これだけで、xxx¥SQLEXPRESSのxxxの部分は、変わった。
コマンドラインから変更する方法など他にあるようだ。
(2)SMSSから、新しい空のデータベースを作成する。(もちろん復元するデータベース名と同じ)
(3)バックアップしてあったファイルをSMSSのバックアップ指定ホルダにコピーをして復元
※ここで「バックアップ セットは、既存のデータベース ‘hogehoge’ 以外のデータベースのバックアップを保持しています。」という変なエラー。オプションっていうわかりづらい入り口から行くと、上書きっていうのがある。それをすればエラーなく復元される。

復元したら、あとは、アクセスから普通に接続するだけ。
ただ、最初に書いたが、新しいPCから接続するには、ODBCの設定をしないとダメ。

SQLserver インポートエラー 列リスト IDENTITY_INSERT

SQLserverでデータをインポートしようとすると、「列リストを使用し、IDENTITY_INSERTをONにしてから実行」のエラーがでる。
どうも連番の設定がしているテーブルにデータを入れるときにコツがいるようだ。

結局下記のようなクエリにしたらOKになった。

SET IDENTITY_INSERT mst_openparts ON
INSERT INTO mst_openparts(GCD, PNO, 製品名コード, 順番, HNO, 品名コード, 品名, 型式, 部品数)
SELECT GCD, PNO, 製品名コード, 順番, HNO, 品名コード, 品名, 型式, 部品数
FROM [マスタ>部品展開]
SET IDENTITY_INSERT mst_openparts OFF

つまりは、細かく列を設定しないとエラーになるようだ。

Access 更新で少数点以下が削除される

VBAにて、あるテーブルの値にて、更新したら、小数点以下が削除された。

結局は、更新する側のテーブルのフィールドが、floatじゃなかったということだけ。

int形式は、整数だけなので、少数まで扱いたい場合は、floatにする。

Access フォーカスが移動できない

レコードセットを使った処理ののち、コントロールを移動させようと頑張ったが、行方不明になり、テキストボックスをクリックしないとカーソルが戻ってこない。自動で移動させたいのだができなかった。
調べてやっとできた。
このような情報がAccessの開発には必要なんですよね。

レコードセットをつかったVBAが書かれているとする。  
Set Me.Recordset = rs

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
DoCmd.ShowAllRecords ※これの前に入れてしまうとコントロールは移動できない。

#####ここ以下にいれることで移動できるようになった######
If IsNull(call_受注番号) Then
受注番号検索 = Null
Me.Visible = False  ※これが必要
Me.Visible = True  ※これが必要
Me.受注番号検索.SetFocus
Else
受注番号検索 = Null
Me.Visible = False
Me.Visible = True
Me.input_納品日入力.SetFocus ※これでやっとコントロールが移動できた。
End If

Null と ”” は違うようなのでで、注意してください。

Access 再入力時にフォーカスが戻ってこない。

Private Sub input_MNO_AfterUpdate()

Me.call_メーカー名 = DLookup(“メーカー名”, “dbo_mst_maker”, “MNO=” & Me.input_MNO)

If IsNull(call_メーカー名) Then
MsgBox (“条件に一致するメーカーは存在しません。”)

Me.call_メーカー名.SetFocus 
※これを入れないと、フォーカスはinput_MNOにとどまっているので、どうしても次のテキストボックスに行ったきり戻ってこない。いったん、あえて、別テキストボックスに移動させて、戻している。

Me.input_MNO.SetFocus
input_MNO = Null
End If

End Sub

Access VBA 文字列の注意点

Private Sub btn_完納確認_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String

※この部分でエラー、抽出されないから、BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています。って感じ。
結局は、文字列だったので、下記のような数値扱いで検索してもレコードが無かったわけです。

SQL = “SELECT * FROM dbo_outsourcing_running WHERE 外注手配番号=” & Me!call_外注手配番号

※答え場下記のように、シングルコーテーションで囲むことでした。
SQL = “SELECT * FROM dbo_outsourcing_running WHERE 外注手配番号='” & Me!call_外注手配番号 & “‘”
Set cn = CurrentProject.Connection
rs.Open SQL, cn, adOpenKeyset, adLockOptimistic

If MsgBox(“完納実行しますか? yes/no”, vbYesNo, “完納処理確認”) = vbYes Then

If call_完納確認 = “完 納” Then

If MsgBox(“完納取消実行しますか? yes/no”, vbYesNo, “完納取消処理確認”) = vbYes Then

rs!完納確認 = “取 消”
rs.Update

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
DoCmd.ShowAllRecords
Exit Sub
End If
Else

rs!完納確認 = “完 納”
rs.Update

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
DoCmd.ShowAllRecords

End If
End If
End Sub

SQLserver Accessでのテーブル追加 キー違反

オートナンバー付の、テーブルから、テーブルにテーブルのデータを追加すると、キー違反でエラーがでる。

オートナンバーが悪さをしていると勝手に思い込んでいたが、ほかのフィールドに含まれていたYesNo型。
Sqlserver では、bit型 これは、NULLが許可されない。つまり、すべてに 0 を書き込んで未チェック状態にしておかなければならない。

そこで、テーブル追加クエリにて、このフィールドに、0 を追加することで回避できた。