Warum der OS-Hinweis im Impressum jetzt riskant ist. Seit dem 20. Juli 2025 ist es offiziell:Die EU-Kommission hat den Betrieb der sogenannten OS-Plattform (Online-Streitbeilegung) endgĂŒltig eingestellt. Das bedeutet:Ein Hinweis darauf im Impressum oder in den AGB ist jetzt nicht nur ĂŒberflĂŒssig, sondern rechtswidrig â und abmahnfĂ€hig. Was war die OS-Plattform ĂŒberhaupt? Die Plattform https://ec.europa.eu/consumers/odr sollte […]
Was KMU in Norddeutschland jetzt tun sollten, um nicht das nĂ€chste Schlagzeilen-Opfer zu werden. Es klingt wie ein IT-MĂ€rchen aus der Kategorie âSo schlimm wird’s schon nicht kommenâ:Ein Hacker knackt ein altes Passwort, ĂŒbernimmt die IT â und bringt damit eine Firma mit 158 Jahren Geschichte zu Fall. Genau das ist passiert: â Golem-Artikel vom […]
Ein Beitrag fĂŒr MittelstĂ€ndler mit Verantwortung Einleitung:Microsoft, Amazon, Google â ihre Cloud-Angebote wirken wie ein bequemes Rundum-Sorglos-Paket. Doch wer heute seine IT-Struktur in die US-Cloud migriert, geht eine Wette ein: auf ewige Erreichbarkeit, stabile Rechtslage und faire Preisgestaltung.Dumm nur, wenn sich alle drei als Illusion erweisen. Aktueller Anlass:IT-Jurist Anton Carniaux bringt es auf den Punkt: […]
Was Du jetzt wissen musst â und warum es keine Ausrede mehr gibt Suchmaschinenoptimierung (SEO) klang fĂŒr viele kleine Unternehmen lange wie eine hippe Marketingfloskel aus der GroĂstadt. Aber die Zeiten haben sich geĂ€ndert. Wer 2025 noch glaubt, dass eine Website mit Adresse und Telefonnummer reicht, wird digital schlicht nicht mehr gefunden â erst recht […]
Wer heute eine Website betreibt â sei es fĂŒr Tischlerei, Steuerberatung oder Ferienwohnung â kommt an einem Thema nicht mehr vorbei: Semantik im HTML. Warum das wichtig ist? Weil nicht nur Menschen Deine Website lesen. Sondern auch Maschinen. Google, ChatGPT, Siri und andere KI-Systeme brauchen Struktur, um zu verstehen, worum es auf Deiner Website geht. […]
Und was MittelstĂ€ndler jetzt darĂŒber wissen sollten KĂŒnstliche Intelligenz (KI) wird in Unternehmen immer mehr zur RealitĂ€t â egal ob als Text-KI im Marketing, als E-Mail-Hilfe in Outlook oder als Assistent im Kundenservice. Was viele dabei vergessen: Auch KI kann manipuliert werden. Eine besonders tĂŒckische Methode nennt sich Prompt Injection â eine Art digitaler FlĂŒsterton, […]
Datenbanken im Wandel â traditioneller Client trifft auf moderne Cloud-Plattform 1. EinfĂŒhrung: Zwei Welten, ein Zweck Microsoft Access ist ein Veteran unter den Desktop-Datenbanklösungen. Seit Jahrzehnten fester Bestandteil von Office und besonders im Mittelstand beliebt fĂŒr schnelle Lösungen mit VBA, Formularen und Berichten. Airtable dagegen ist der hippe Newcomer aus der Cloud: eine Mischung aus […]
WhatsApp ist schnell, einfach â und leider auch steuerlich relevant. Wer AuftrĂ€ge, Preise oder Absprachen per Messenger regelt, muss wissen: §âŻ147 AO kennt keine App-Ausnahmen. Aufzeichnungspflicht heiĂt Aufzeichnungspflicht â auch wennâs „nur WhatsApp“ ist. Viele Unternehmer und ihre Mitarbeiter kommunizieren geschĂ€ftlich ĂŒber private Handys. Das ist bequem â aber auch brandgefĂ€hrlich, wenn es zur BetriebsprĂŒfung […]
Wie ich Access-Daten mit anderen Anwendungen vernetze...
Warum das Vorurteil nervt
Access könne nicht mit anderen Systemen sprechen?Blödsinn.Access kann, wenn Du willst. Du musst es ihm nur beibringen.
Die Klassiker der Anbindung
1. Excel als Mittelsmann
Du exportierst Daten in eine Excel-Datei, die ein anderer Prozess wieder einliest?Kann man machen. Ist aber nur Ăbergangslösung.
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _
"qry_Kunden", "C:\temp\kunden.xlsx", True
2. CSV und JSON - simpel, aber mÀchtig
Manche Anwendungen wollen es roh. Kein Problem.CSV:
Open "C:\temp\kunden.csv" For Output As #1
Print #1, "ID;Name;Email"
Do Until rs.EOF
Print #1, rs!ID & ";" & rs!Name & ";" & rs!Email
rs.MoveNext
Loop
Close #1
JSON geht auch. Du brauchst nur ein bisschen String-Bastelei - oder nimm ein fertiges JSON-Modul.
3. REST-APIs per WinHttp
Viele Systeme erwarten REST-Zugriffe. Access kann auch das:
Dim http As Object
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
http.Open "POST", "https://api.example.com/customer", False
http.SetRequestHeader "Content-Type", "application/json"
http.Send "{""name"":""SchÀfer GmbH"",""email"":""info@example.com""}"
Debug.Print http.ResponseText
Tipp: Authentifizierung, Token-Verwaltung und Fehlerhandling sind Pflicht.
Wann ODBC ins Spiel kommt
Du kannst Access auch direkt mit SQL-Server, MySQL oder sogar cloudbasierten DBs verbinden.
Beispiel fĂŒr dynamisches Reconnect:
Dim tdf As TableDef
Set tdf = CurrentDb.TableDefs("tbl_KundenExtern")
tdf.Connect = "ODBC;Driver={MySQL ODBC 8.0 Driver};Server=192.168.0.10;Database=crm;Uid=admin;Pwd=passwort;"
tdf.RefreshLink
So holst Du Dir Live-Daten, ohne sie lokal zu duplizieren.
Integration mit WordPress?
Klar. Du kannst REST-Endpunkte aus WordPress nutzen oder direkt in die MySQL-Tabellen schreiben.Sauberer ist immer die API.
Access schickt z. B. Bestellungen nach WordPress:
jsonPayload = "{""title"":""Neue Bestellung"",""status"":""publish"",""content"":""Access hat bestellt""}"
http.Open "POST", "https://meinewebseite.de/wp-json/wp/v2/posts", False
http.SetRequestHeader "Authorization", "Bearer " & myToken
http.Send jsonPayload
Zwischenfazit
Wer Access nicht integriert bekommt, hat's nicht versucht.Access ist kein Daten-Silo. Es ist ein schweigsamer Kollege, der viel kann - wenn Du ihn fragst.
Dein nÀchster Schritt
Wenn Du in Deiner Firma Access im Einsatz hast - und die Daten nicht flieĂen -dann wird's Zeit fĂŒr ein ErstgesprĂ€ch mit dem DatenschĂ€fer.Wir bauen BrĂŒcken. Auch zwischen Access und dem Rest der Welt.
Warum ich mir BenutzeraktivitÀten genauer anschaue
Ab einer gewissen GröĂe will die GeschĂ€ftsleitung wissen:Wer hat wann was gemacht?Welche Daten wurden gelesen, verĂ€ndert oder gelöscht?Nicht zur Kontrolle - sondern zur Absicherung.
SQL Server 2025 bringt einige Neuerungen, mit denen ich genau das leichter abbilden kann.Und ich zeige Dir, wie ich das ohne Enterprise-Edition aufbaue.
1. Server Audit (auch in Standard Edition)
SQL Server 2025 erlaubt jetzt auch in der Standard Edition mehr Audit-Events.
Setup: Audit erstellen
CREATE SERVER AUDIT Audit_KMU
TO FILE (FILEPATH = 'C:\AuditLogs\', MAXSIZE = 10 MB)
WITH (ON_FAILURE = CONTINUE);
ALTER SERVER AUDIT Audit_KMU WITH (STATE = ON);
Ereignis hinzufĂŒgen
CREATE SERVER AUDIT SPECIFICATION Audit_Logins
FOR SERVER AUDIT Audit_KMU
ADD (SUCCESSFUL_LOGIN_GROUP),
ADD (FAILED_LOGIN_GROUP);
ALTER SERVER AUDIT SPECIFICATION Audit_Logins WITH (STATE = ON);
Du bekommst jetzt zuverlÀssig mit:
Wer sich einloggt
Wer es (vergeblich) versucht
Wann das passiert
2. Datenbank-spezifisches Audit
CREATE DATABASE AUDIT SPECIFICATION Audit_Updates
FOR SERVER AUDIT Audit_KMU
ADD (UPDATE ON dbo.kunden BY public),
ADD (DELETE ON dbo.kunden BY public);
ALTER DATABASE AUDIT SPECIFICATION Audit_Updates WITH (STATE = ON);
Jetzt weiĂt Du z. B., wenn jemand an dbo.kunden rumfummelt.Mit User, Uhrzeit, Statement, Hostname.
3. Neuerung 2025: Audit Lookup Views
Neu in SQL Server 2025: Audit-EintrÀge lassen sich direkt als Views abfragen.
SELECT
event_time,
server_principal_name,
database_name,
object_name,
statement
FROM sys.dm_audit_log_lookup
WHERE object_name = 'kunden'
AND event_time > DATEADD(DAY, -1, GETDATE());
Das spart Dir das Zusammenbasteln aus xel-Files und Viewer.
4. Benutzerdefiniertes Logging (manuell)
FĂŒr eigene Protokolle logge ich sensitive Aktionen selbst - z. B. in Triggern.
CREATE TRIGGER trg_LogDelete
ON dbo.kunden
AFTER DELETE
AS
BEGIN
INSERT INTO dbo.audit_log (aktion, tabelle, benutzer, datum, details)
SELECT
'DELETE', 'kunden', SYSTEM_USER, GETDATE(),
CONCAT('Gelöscht: ', name, ', ID: ', id)
FROM deleted;
END;
Vorteil: lÀuft unabhÀngig vom Server-Audit.Nachteil: bei vielen Aktionen ein Performancefaktor.
5. Extended Events fĂŒr Lesefolgen
Lesen wird nicht geloggt. AuĂer, Du willst es.
Beispiel: SELECTs auf sensible Tabelle tracken
CREATE EVENT SESSION Track_KundenSelects
ON SERVER
ADD EVENT sqlserver.sql_statement_completed (
WHERE sqlserver.database_name = 'KundenDB'
AND sqlserver.sql_text LIKE '%FROM dbo.kunden%'
)
ADD TARGET package0.ring_buffer;
ALTER EVENT SESSION Track_KundenSelects ON SERVER STATE = START;
Dann auslesen:
SELECT
event_data.value('(event/@name)[1]', 'varchar(100)') AS event_name,
event_data.value('(event/data[@name="statement"]/value)[1]', 'varchar(max)') AS sql_text,
event_data.value('(event/action[@name="client_app_name"]/value)[1]', 'varchar(100)') AS app_name,
event_data.value('(event/action[@name="username"]/value)[1]', 'varchar(100)') AS user_name,
event_data.value('(event/@timestamp)[1]', 'datetime') AS event_time
FROM (
SELECT CAST(event_data AS XML) AS event_data
FROM sys.dm_xe_sessions AS s
JOIN sys.dm_xe_session_targets AS t
ON s.address = t.event_session_address
WHERE s.name = 'Track_KundenSelects'
) x;
6. Sichtbare Reports fĂŒr Admins
Ich baue in SSMS Views wie:
CREATE VIEW vw_Audit_LetzteAktivitÀten AS
SELECT TOP 100
event_time,
server_principal_name AS benutzer,
database_name,
object_name,
statement
FROM sys.dm_audit_log_lookup
ORDER BY event_time DESC;
Dann haben Admins immer einen Ăberblick, ohne im File Explorer zu wĂŒhlen.
7. Proaktive Checks auf RollenÀnderung
SELECT
name,
create_date,
modify_date,
principal_id,
type_desc
FROM sys.database_principals
WHERE type IN ('S', 'U') AND modify_date > GETDATE() - 7;
Wenn jemand sich selbst db_owner gegeben hat - hier siehst Du es.
Mein Fazit
Security Audits sind kein Luxus.Und SQL Server 2025 macht's leichter als je zuvor.Weniger Tricks, mehr Bordmittel.Wenn Du willst, schick ich Dir gern meine Starter-Definitionen als SQL-Datei.Oder ein Standard-Audit-Paket fĂŒr KMU-Datenbanken.
Viele kleine und mittlere Unternehmen (KMU) kennen das Spiel:Die Website dĂŒmpelt irgendwo auf Seite 7 bei Google.Der Vertrieb Ă€chzt. Die Konkurrenz ist online plötzlich sichtbar, aktiv, erfolgreich. Und dann kommt er:Der Heilsbringer mit dem angeblichen Geheimtipp:âKauf doch einfach ein paar Backlinks â dann bist Du in einer Woche auf Platz 1.â Spoiler: Nein, bist Du […]
Warum BigInt jetzt wichtig ist
Access war lange begrenzt auf Long = 32 Bit = ±2.147.483.647FĂŒr IDs, Hashes, Unix-Timestamps oder externe Systeme oft zu klein.
Seit Access 2016 (mit Update) gibt's BigInt = 64 Bit = ±9.223.372.036.854.775.807Das ist ein echter Fortschritt.Wenn Du mit SQL Server, MySQL, REST oder ERP-Daten arbeitest: unverzichtbar.
Wie Du BigInt aktivierst
StandardmĂ€Ăig ist BigInt in Access nicht aktiviert.Du musst es manuell anschalten.
Schritt 1: Registry-Schalter setzen
[HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE]
"EnableBigInt"=dword:00000001
Danach Access neu starten.
Alternativ per VBA (nur einmal nötig):
Sub AktiviereBigInt()
CreateObject("WScript.Shell").RegWrite _
"HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE\EnableBigInt", 1, "REG_DWORD"
End Sub
JetSQL und BigInt
In Tabellen wird BigInt als Zahl (GroĂ) angezeigt.Im SQL-Editor kannst Du normal darauf zugreifen.
Beispiel:
SELECT id64bit, beschreibung FROM t_grosse_ids WHERE id64bit > 5000000000;
Abfragen, Sortierungen, Joins - alles wie gewohnt. Nur eben gröĂer.
Datenimport mit BigInt
Wenn Du aus externen Systemen importierst (ODBC), erkennt Access BigInt korrekt - aber nur, wenn der Registry-Schalter gesetzt ist.
Sub VerbindeMitMySQL()
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "DROP TABLE IF EXISTS t_ext_produkt"
db.Execute "SELECT * INTO t_ext_produkt FROM [ODBC;DSN=MySQL;UID=readonly;PWD=geheim;].produkt"
End Sub
Spalte produkt_id bigint in MySQL wird als BigInt in Access erkannt.
BigInt in VBA
VBA hat keinen nativen BigInt-Datentyp.
Aber:
Du kannst Currency nutzen (64 Bit, Integer-Speicherung, ±922 B)
Oder Du nutzt Decimal via Variant (mit Risiko)
Beispiel mit Currency
Dim id64 As Currency
id64 = 123456789012#
Debug.Print Format$(id64, "0")
Beispiel mit Variant-Decimal
Dim v As Variant
v = CDec(9223372036854775807#)
Debug.Print v
Aber: Keine Typensicherheit, kein Vergleich mit Longs ohne Casting.
Wenn Du BigInt in Formeln brauchst
Dim erg As Currency
erg = CLng(Me.txtWert1) * 100000#
If erg > 100000000000# Then
MsgBox "Wert zu groĂ!"
End If
Tipp: Benutze Currency auch fĂŒr ZĂ€hlungen oder Unix-Timestamps.
Tabelle: Vergleich Datentypen in Access
TypGröĂeBereichBemerkungByte1 Byte0 - 255Nur ganzzahlige WerteInteger2 Byte-32.768 - 32.767Selten sinnvollLong4 Byte-2.147.483.648 - 2.147.483.647Standard fĂŒr AutoWertCurrency8 Byte±922.337.203.685.477,5808Intern 64-Bit-IntegerBigInt8 Byte±9.223.372.036.854.775.807Nur mit Registry aktivierbar
Wann BigInt Pflicht wird
Schnittstellen zu SQL Server oder MySQL mit Identity(1,1) BIGINT
Verarbeitung von Timestamps (z. B. Unix Epoch in Millisekunden)
Technische IDs (GUID-Hashes als int64)
REST-APIs mit groĂen Mengenkennzahlen
Wenn Du in Access mit echten Systemdaten arbeitest, fĂŒhrt kein Weg an BigInt vorbei.
Nicht fĂŒr jeden Datensatz - aber fĂŒr jeden ernsthaften Datenentwickler.Und mit ein bisschen Registry, Currency-Trick und klaren Typen bekommst Du das gut in den Griff.Wenn Du willst, schicke ich Dir meine Feldkonvertierungsroutine als Modul.
Warum ich das ĂŒberhaupt mache
Access-Frontends, die mit Webdiensten oder SQL-Servern kommunizieren, sind oft schmerzhaft offen.Aber: Ich will keine vollwertige Authentifizierungsplattform bauen.Ich will einfache Regeln.Wer darf, wann, von wo.
Also: IP-Check, Benutzerkennung, Zeitfenster.Direkt in VBA und im Backend.
1. IP-Adressen filtern (Client-seitig)
In VBA kannst Du die IP des Rechners ermitteln und mit einer Whitelist abgleichen.
IP holen (funktioniert meistens intern)
Function HoleIP() As String
Dim wmi As Object, obj As Object
Set wmi = GetObject("winmgmts:\\.\root\cimv2")
For Each obj In wmi.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
If Not IsNull(obj.IPAddress) Then
HoleIP = obj.IPAddress(0)
Exit Function
End If
Next
End Function
PrĂŒfung gegen einfache Whitelist
Function CheckIP() As Boolean
Dim erlaubteIPs As Variant
erlaubteIPs = Array("192.168.1.100", "192.168.1.101")
Dim ip As String
ip = HoleIP()
Dim i As Integer
For i = LBound(erlaubteIPs) To UBound(erlaubteIPs)
If ip = erlaubteIPs(i) Then
CheckIP = True
Exit Function
End If
Next
MsgBox "Zugriff verweigert. Deine IP ist nicht zugelassen.", vbCritical
CheckIP = False
End Function
Am besten rufst Du CheckIP direkt im Startformular auf und beendest die App bei Ablehnung.
2. Benutzerkonten & Zeitsperren aus zentraler Tabelle
Ich lege mir eine kleine Tabelle im Backend an:
benutzergueltig_vongueltig_bisaktivip_erwartetSCHMIDT2025-05-012025-06-30 23:59Ja192.168.1.100
PrĂŒfung bei Login
Function CheckZugang(Benutzer As String) As Boolean
Dim rs As DAO.Recordset
Dim sql As String
sql = "SELECT * FROM zugangskontrolle WHERE benutzer = '" & Benutzer & "' AND aktiv = TRUE"
Set rs = CurrentDb.OpenRecordset(sql)
If rs.EOF Then
MsgBox "Zugang verweigert: Benutzer nicht aktiv.", vbCritical
CheckZugang = False
Exit Function
End If
Dim jetzt As Date
jetzt = Now
If jetzt < rs!gueltig_von Or jetzt > rs!gueltig_bis Then
MsgBox "Zugang verweigert: AuĂerhalb des Zeitfensters.", vbCritical
CheckZugang = False
Exit Function
End If
If Nz(rs!ip_erwartet, "") <> "" Then
If HoleIP() <> rs!ip_erwartet Then
MsgBox "Zugang verweigert: IP nicht erlaubt.", vbCritical
CheckZugang = False
Exit Function
End If
End If
CheckZugang = True
End Function
Aufruf z. B. im Autoexec-Modul
If Not CheckZugang(Environ("USERNAME")) Then
DoCmd.Quit
End If
3. Serverseitig absichern
Wenn Du mit einem Webdienst oder SQL Server arbeitest, kannst Du auch serverseitig filtern.
Beispiel in PHP (REST-Endpunkt)
$remote_ip = $_SERVER['REMOTE_ADDR'];
$erlaubt = ['192.168.1.100', '203.0.113.55'];
if (!in_array($remote_ip, $erlaubt)) {
http_response_code(403);
exit('IP nicht erlaubt');
}
SQL-Trigger bei INSERT aus Access
CREATE TRIGGER trg_block_unerlaubten_zugriff
ON dbo.import_tabelle
AFTER INSERT
AS
BEGIN
IF EXISTS (
SELECT * FROM inserted WHERE session_user NOT IN ('support_user', 'access_user')
)
BEGIN
RAISERROR ('Nicht autorisierter Benutzer', 16, 1)
ROLLBACK
END
END
4. Logging: Wer versucht's trotzdem?
Leg Dir ein einfaches Audit-Log an:
Sub LogZugriffsversuch(Benutzer As String, IP As String, Erfolg As Boolean)
CurrentDb.Execute "INSERT INTO zugriffslog (zeitpunkt, benutzer, ip, erfolg) VALUES (Now(), '" & Benutzer & "', '" & IP & "', " & Erfolg & ")"
End Sub
Ich nutze das spÀter, um bruteforce-artige Zugriffe zu erkennen oder IP-Ranges zu blocken.
Access ist kein Sicherheitswunder.
Aber mit IP-Check, Benutzerliste und Zeitsperren kannst Du schon viel verhindern.Gerade wenn Webdienste oder Cloudsysteme angebunden sind, brauchst Du sowas.