2017-02-08 4 views
1

Ich habe einige Probleme mit dem Versuch, eine schreibgeschützte Verbindung zu erstellen und nicht sicher, ob es ein Fehler oder mein Fehler ist.Readonly Verbindung mit mssql und pyodbc

Die Dokumentation von Pyodbc zeigt an, dass es möglich ist, eine schreibgeschützte Verbindung zu erstellen. Siehe https://mkleehammer.github.io/pyodbc/api-module.html

Beim Ausführen der folgenden obwohl ich keine Fehler erhalte und es läuft, als ob das READONLY-Schlüsselwort überhaupt nicht vorhanden war (das Update läuft).

import pyodbc 

readonly_conn_str = "DRIVER={SQL Server Native Client 10.0};SERVER=...;DATABASE=...;UID=...;PWD=...;READONLY=True;" 
conn = pyodbc.connect(readonly_conn_str) 
cursor = conn.cursor() 
result = cursor.execute(update_query) 
cursor.commit() 
print(result.rowcount) 

Wenn ich versuche, Funktion Schlüsselwörter verwenden, bekomme ich das gleiche.

... 
conn = pyodbc.connect(conn_str, readonly=True) 
... 
+0

Erhalten Sie einen Fehler? Wo funktioniert es nicht? Wie ist das Verhalten? – FlipperPA

+0

Entschuldigung. Ich habe die Frage aktualisiert, um klarer zu sein – lwpaul

+0

Vielleicht * readonly *, Kleinbuchstaben? So erscheint es in der Dokumentation und wird nicht zur Interpretation an den ODBC-Treiber übergeben. –

Antwort

1

Wenn wir rufen pyodbc.connect mit readonly=True, ruft Pyodbc pflichtschuldigst die ODBC-Funktion

ret = SQLSetConnectAttr(cnxn->hdbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)SQL_MODE_READ_ONLY, 0); 

SQL_MODE_READ_ONLY eine der Standard-ODBC ist SQL_ATTR_ACCESS_MODE Attribute. Wie sich das auf das Verhalten der ODBC-Verbindung auswirkt, hängt vom ODBC-Treiber ab. Wie in der ODBC documentation erklärte:

SQL_MODE_READ_ONLY durch den Fahrer oder die Datenquelle als Indikator, dass die Verbindung nicht erforderlich ist, SQL-Anweisungen zu unterstützen, die Updates verursachen auftreten. Dieser Modus kann verwendet werden, um die Sicherungsstrategien, die Transaktionsverwaltung oder andere Bereiche entsprechend dem Treiber oder der Datenquelle zu optimieren. Der Treiber muss nicht verhindern, dass solche Anweisungen an die Datenquelle gesendet werden. Das Verhalten des Treibers und der Datenquelle bei der Verarbeitung von SQL-Anweisungen, die während einer schreibgeschützten Verbindung nicht schreibgeschützt sind, ist implementierungsdefiniert.

Mit anderen Worten, pyodbc hat das Attribut "schreibgeschützt" an den ODBC-Treiber übergeben. Es liegt am Treiber zu entscheiden, ob es als Hinweis, als harte Einschränkung oder als etwas, das einfach ignoriert werden soll, interpretiert werden sollte.

Verwandte Themen