Schlagwort: NULL

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.