2

次のようなDDLステートメントを使用してパスワードを変更しようとしています。

CurrentProject.Connection.Execute "ALTER USER barney PASSWORD "[]!@#$%^ oldpassword"

はい、それは厄介なパスワードですが、誰かがそのようなことを試みました。パスワードの最初の引用符は、ここではsql構文の一部ではないことに注意してください。mysql_real_escape_string()VBA用以外のものが必要です。ヒントはありますか?

4

2 に答える 2

1

あなたは何かにぶつかったようです:SQL DDLを使用してそれらの文字のいずれかを含む(使用可能な)パスワードを作成することはできません(ウィキペディアはこれをSQL DCLと見なしていることに注意してください)。

以下は、テストシナリオを再現するためのコードです。

  • 新しいワークグループを作成します(一時フォルダー内)
  • ワークグループを使用して新しいデータベースを作成します
  • データを含む新しいテーブルを作成します
  • 全体に英数字を使用して、名前、パスワード、およびPIDを持つ新しいユーザーを作成します
  • テーブルに対する特権をユーザーに付与します
  • 新しいユーザーの資格情報を使用してテスト接続を開きます
  • ユーザーがテーブルをクエリできることをテストします

投稿されたコードは正常に機能します。ただし、両方の場所(ユーザーが作成されたときとテスト接続が開かれたとき)でパスワードを編集して非英字(引用符など)を追加すると、これらの場所の1つでエラーが発生します。

On Error Resume Next
Kill Environ$("temp") & "\MyDatabase.mdb"
Kill Environ$("temp") & "\MyWorkgroup.mdw"
On Error GoTo 0

' Create workgroup and db
Dim cat 
Set cat = CreateObject("ADOX.Catalog")
With cat
  .Create _
      "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Jet OLEDB:Engine Type=4;" & _
      "Data Source=" & _
      Environ$("temp") & "\MyWorkgroup.mdw;" & _
      "Jet OLEDB:Create System Database=-1"
  .Create _
      "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Jet OLEDB:Engine Type=4;" & _
    "Data Source=" & _
    Environ$("temp") & "\MyDatabase.mdb;" & _
    "Jet OLEDB:System Database=" & _
    Environ$("temp") & "\MyWorkgroup.mdw;"

  ' Add table with data and user with privileges
  With .ActiveConnection
    .Execute "CREATE TABLE Test (data_col INTEGER);"
    .Execute "INSERT INTO Test VALUES (55);"
    .Execute "CREATE USER onedaywhen pwd H3sJaZ9k2m;"  ' <-- edit pwd
    .Execute "GRANT ALL PRIVILEGES ON Test TO onedaywhen;"
  End With
End With

' Test user can connect and SELECT
Dim con 
Set con = CreateObject("ADODB.Connection")
With con
  .ConnectionString = _
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Jet OLEDB:Engine Type=4;" & _
    "Data Source=" & _
    Environ$("temp") & "\MyDatabase.mdb;" & _
    "Jet OLEDB:System Database=" & _
    Environ$("temp") & "\MyWorkgroup.mdw;" & _
    "User ID=onedaywhen;Password=pwd;"  ' <-- edit pwd
  .Open
  MsgBox .Execute("SELECT * FROM Test;")(0)
End With

「特殊」文字をエスケープする手段がない場合、SQL DDL / DCMを使用してこれを実行することはできないようです。つまり、ADOを使用してエスケープすることはまったくできないと思います。

だから、誰かがDAOなどの代替手段を手に入れましたか?

于 2009-10-15T10:53:43.510 に答える
0

Chr(34) を使用して文字列に連結できるはずです。

  Dim strPassword As String

  strPassword = Chr(34) & "[]!@#$%^"
  CurrentProject.Connection.Execute "ALTER USER barney PASSWORD " & strPassword & " oldpassword"

これは、この種のことを行う通常の方法です。ただし、ユーザー レベルのセキュリティ UI は引用符を受け入れない可能性があるため (試したことはありません)、これではうまくいかない可能性があります。

于 2009-10-15T03:37:37.477 に答える