FileIndexDB erstellen
Ab der Version 26.8.10 benötigt WWS MaX eine FileIndexDB, um die semantische Suche und die KI-Funktionen nutzen zu können. Diese Datenbank wird automatisch durch den SQL Update Assistent von WWS MaX beim Start erstellt, sofern die angegebene Datenbankverbindung über CREATE DATABASE Berechtigung auf dem Server verfügt.
Sollte die Datenbankverbindung nicht über die Berechtigung CREATE DATABASE verfügen, muss die Datenbank vor einem Update der WWS manuell erstellt werden.
-
Öffnen Sie auf dem Datenbankserver das SQL Server Management Studio (SSMS) und verbinden Sie sich mit dem Server, auf dem die WWS MaX Datenbank liegt.
-
Wählen Sie die WWS MaX Datenbank auf der linken Seite aus und klicken Sie mit der rechten Maustaste darauf. Wählen Sie Neue Abfrage aus.
Die Bezeichnung der WWS MaX Datenbank kann je nach Installation variieren. In der Regel ist dies der Name des Unternehmens, z.B.
SProssGmbH. -
Kopieren Sie das nachfolgende Script in den Abfrage-Editor und klicken Sie auf Ausführen.
SET NOCOUNT ON;SET IMPLICIT_TRANSACTIONS OFF;/* ============================================================WWS FileIndex - Bootstrap / UpdateDas Script wird IMMER auf der WWS-Hauptdatenbank ausgeführt.Beispiel:Aktuelle Datenbank:SProssGmbHFileIndex-Datenbank:SProssGmbH_FileIndexVerhalten:- Verhindert *_FileIndex_FileIndex- Legt FileIndex-DB an, wenn sie fehlt- Verwendet vorhandene FileIndex-DB weiter- Konfiguriert die FileIndex-DB- Übernimmt direkte db_owner-Benutzer- Unterstützt Benutzer WITH LOGIN- Unterstützt Benutzer WITHOUT LOGIN- Nicht reproduzierbare Benutzer werden nur gemeldet- Kann beliebig oft ausgeführt werden============================================================ */DECLARE @Suffix nvarchar(20) = N'_FileIndex';DECLARE @SourceDatabase sysname = DB_NAME();DECLARE @TargetDatabase sysname;DECLARE @TargetDatabaseLong nvarchar(260);DECLARE @Sql nvarchar(max);DECLARE @ErrorMessage nvarchar(2048);DECLARE @DatabaseCreated bit = 0;/* ============================================================1. Grundlegende Sicherheitsprüfungen============================================================ *//* ------------------------------------------------------------CREATE/ALTER DATABASE darf nicht innerhalb einerbestehenden Transaktion ausgeführt werden.------------------------------------------------------------ */IF @@TRANCOUNT <> 0BEGIN;THROW 51000,'Das FileIndex-Update darf nicht innerhalb einer SQL-Transaktion ausgeführt werden.',1;END;/* ------------------------------------------------------------Aktuelle Datenbank muss feststellbar sein.------------------------------------------------------------ */IF @SourceDatabase IS NULLBEGIN;THROW 51001,'Die aktuelle WWS-Datenbank konnte nicht ermittelt werden.',1;END;/* ------------------------------------------------------------Systemdatenbanken ausschließen.------------------------------------------------------------ */IF DB_ID(@SourceDatabase) <= 4BEGIN;THROW 51002,'Das FileIndex-Update darf nicht auf einer SQL-Server-Systemdatenbank ausgeführt werden.',1;END;/* ------------------------------------------------------------Unbedingt verhindern:SProssGmbH_FileIndex->SProssGmbH_FileIndex_FileIndex------------------------------------------------------------ */IF LOWER(RIGHT(@SourceDatabase, LEN(@Suffix))) = LOWER(@Suffix)BEGIN;THROW 51003,'Die aktuelle Datenbank ist bereits eine FileIndex-Datenbank. Das Update wurde abgebrochen.',1;END;/* ============================================================2. Ziel-Datenbanknamen erzeugen============================================================ */SET @TargetDatabaseLong =CONVERT(nvarchar(128), @SourceDatabase) +@Suffix;IF LEN(@TargetDatabaseLong) > 128BEGIN;THROW 51004,'Der abgeleitete Name der FileIndex-Datenbank ist länger als 128 Zeichen.',1;END;SET @TargetDatabase =CONVERT(sysname, @TargetDatabaseLong);/* ============================================================3. FileIndex-Datenbank bei Bedarf anlegen============================================================ */IF DB_ID(@TargetDatabase) IS NULLBEGINBEGIN TRY/* ----------------------------------------------------CREATE DATABASE wird als eigener dynamischerSQL-Batch ausgeführt.---------------------------------------------------- */SET @Sql =N'CREATE DATABASE ' +QUOTENAME(@TargetDatabase) +N';';EXEC sys.sp_executesql @Sql;SET @DatabaseCreated = 1;PRINTN'FileIndex-Datenbank wurde angelegt: ' +QUOTENAME(@TargetDatabase);END TRYBEGIN CATCHSET @ErrorMessage =N'Die FileIndex-Datenbank "' +@TargetDatabase +N'" konnte nicht angelegt werden. ' +N'SQL Server: ' +ERROR_MESSAGE();;THROW 51010, @ErrorMessage, 1;END CATCH;ENDELSEBEGINPRINTN'FileIndex-Datenbank ist bereits vorhanden: ' +QUOTENAME(@TargetDatabase);END;/* ------------------------------------------------------------Sicherheitsprüfung------------------------------------------------------------ */IF DB_ID(@TargetDatabase) IS NULLBEGIN;THROW 51011,'Die erwartete FileIndex-Datenbank wurde nicht gefunden.',1;END;/* ============================================================4. FileIndex-Datenbank konfigurieren============================================================ */BEGIN TRY/* --------------------------------------------------------Recovery Model-------------------------------------------------------- */SET @Sql =N'ALTER DATABASE ' +QUOTENAME(@TargetDatabase) +N' SET RECOVERY SIMPLE;';EXEC sys.sp_executesql @Sql;/* --------------------------------------------------------AUTO_CLOSE-------------------------------------------------------- */SET @Sql =N'ALTER DATABASE ' +QUOTENAME(@TargetDatabase) +N' SET AUTO_CLOSE OFF;';EXEC sys.sp_executesql @Sql;/* --------------------------------------------------------AUTO_SHRINK-------------------------------------------------------- */SET @Sql =N'ALTER DATABASE ' +QUOTENAME(@TargetDatabase) +N' SET AUTO_SHRINK OFF;';EXEC sys.sp_executesql @Sql;/* --------------------------------------------------------Statistiken-------------------------------------------------------- */SET @Sql =N'ALTER DATABASE ' +QUOTENAME(@TargetDatabase) +N' SET AUTO_CREATE_STATISTICS ON;';EXEC sys.sp_executesql @Sql;SET @Sql =N'ALTER DATABASE ' +QUOTENAME(@TargetDatabase) +N' SET AUTO_UPDATE_STATISTICS ON;';EXEC sys.sp_executesql @Sql;SET @Sql =N'ALTER DATABASE ' +QUOTENAME(@TargetDatabase) +N' SET AUTO_UPDATE_STATISTICS_ASYNC ON;';EXEC sys.sp_executesql @Sql;/* --------------------------------------------------------PAGE_VERIFY-------------------------------------------------------- */SET @Sql =N'ALTER DATABASE ' +QUOTENAME(@TargetDatabase) +N' SET PAGE_VERIFY CHECKSUM;';EXEC sys.sp_executesql @Sql;/* --------------------------------------------------------READ_COMMITTED_SNAPSHOT nur ändern, wenn noch OFF.Das vermeidet unnötige ALTER DATABASE Aufrufe.-------------------------------------------------------- */IF EXISTS(SELECT 1FROM sys.databasesWHERE name = @TargetDatabaseAND is_read_committed_snapshot_on = 0)BEGINSET @Sql =N'ALTER DATABASE ' +QUOTENAME(@TargetDatabase) +N' SET READ_COMMITTED_SNAPSHOT ON;';EXEC sys.sp_executesql @Sql;END;/* --------------------------------------------------------SQL Server 2022 / Version 16 oder neuerASYNC_STATS_UPDATE_WAIT_AT_LOW_PRIORITY-------------------------------------------------------- */IF TRY_CONVERT(int,SERVERPROPERTY('ProductMajorVersion')) >= 16BEGINSET @Sql =N'USE ' +QUOTENAME(@TargetDatabase) +N';ALTER DATABASE SCOPED CONFIGURATIONSET ASYNC_STATS_UPDATE_WAIT_AT_LOW_PRIORITY = ON;';EXEC sys.sp_executesql @Sql;END;PRINTN'FileIndex-Datenbank wurde konfiguriert.';END TRYBEGIN CATCHSET @ErrorMessage =N'Die FileIndex-Datenbank "' +@TargetDatabase +N'" konnte nicht vollständig konfiguriert werden. ' +N'SQL Server: ' +ERROR_MESSAGE();;THROW 51020, @ErrorMessage, 1;END CATCH;/* ============================================================5. db_owner-Mitglieder der Hauptdatenbank übernehmen============================================================ *//* ------------------------------------------------------------Es werden bewusst nur Benutzer / Windows-Benutzer /Windows-Gruppen berücksichtigt.S = SQL UserU = Windows UserG = Windows GroupBenutzerdefinierte Datenbankrollen werden nicht kopiert.------------------------------------------------------------ */DECLARE@UserName sysname,@LoginName sysname,@UserType char(1),@AuthenticationType nvarchar(60),@UserSid varbinary(85);DECLARE @DbOwnerCount int = 0;DECLARE @CopiedCount int = 0;DECLARE @SkippedCount int = 0;DECLARE DbOwnerCursor CURSOR LOCAL FAST_FORWARDFORSELECT DISTINCTMemberPrincipal.name,ServerPrincipal.name,MemberPrincipal.type,MemberPrincipal.authentication_type_desc,MemberPrincipal.sidFROM sys.database_role_members AS RoleMemberINNER JOIN sys.database_principals AS RolePrincipalON RolePrincipal.principal_id =RoleMember.role_principal_idINNER JOIN sys.database_principals AS MemberPrincipalON MemberPrincipal.principal_id =RoleMember.member_principal_idLEFT JOIN sys.server_principals AS ServerPrincipalON ServerPrincipal.sid =MemberPrincipal.sidAND ServerPrincipal.type IN('S','U','G')WHERERolePrincipal.name = N'db_owner'AND MemberPrincipal.type IN('S','U','G')AND MemberPrincipal.name NOT IN(N'dbo',N'guest',N'INFORMATION_SCHEMA',N'sys')ORDER BYMemberPrincipal.name;OPEN DbOwnerCursor;FETCH NEXT FROM DbOwnerCursorINTO@UserName,@LoginName,@UserType,@AuthenticationType,@UserSid;WHILE @@FETCH_STATUS = 0BEGINSET @DbOwnerCount += 1;BEGIN TRY/* ====================================================5.1 Benutzer besitzt einen Server-Login==================================================== */IF @LoginName IS NOT NULLBEGINSET @Sql =N'USE ' +QUOTENAME(@TargetDatabase) +N';DECLARE @ExistingPrincipal sysname;/* ---------------------------------------------------------Existiert der gleiche Login über seine SID bereits?Das kann insbesondere "dbo" sein, wenn dieser LoginBesitzer der Datenbank ist.--------------------------------------------------------- */SELECT TOP (1)@ExistingPrincipal = nameFROM sys.database_principalsWHERE sid = @UserSid;/* ---------------------------------------------------------Noch kein Benutzer für diesen Login vorhanden.--------------------------------------------------------- */IF @ExistingPrincipal IS NULLBEGIN/* -----------------------------------------------------Namenskollision verhindern.Gleicher Benutzername aber andere SID wäre gefährlich.----------------------------------------------------- */IF EXISTS(SELECT 1FROM sys.database_principalsWHERE name = @UserNameAND sid <> @UserSid)BEGINDECLARE @CollisionMessage nvarchar(2048);SET @CollisionMessage =N''Der Benutzername "'' +@UserName +N''" existiert in der FileIndex-Datenbank bereits mit einer anderen SID.'';;THROW 51031, @CollisionMessage, 1;END;CREATE USER ' +QUOTENAME(@UserName) +N'FOR LOGIN ' +QUOTENAME(@LoginName) +N';SET @ExistingPrincipal = @UserName;END;/* ---------------------------------------------------------dbo besitzt ohnehin vollständige Datenbankrechte.--------------------------------------------------------- */IF @ExistingPrincipal <> N''dbo''BEGINIF NOT EXISTS(SELECT 1FROM sys.database_role_members AS RMINNER JOIN sys.database_principals AS RON R.principal_id =RM.role_principal_idINNER JOIN sys.database_principals AS MON M.principal_id =RM.member_principal_idWHERER.name = N''db_owner''AND M.name = @ExistingPrincipal)BEGINDECLARE @RoleSql nvarchar(max);SET @RoleSql =N''ALTER ROLE [db_owner] ADD MEMBER '' +QUOTENAME(@ExistingPrincipal) +N'';'';EXEC sys.sp_executesql @RoleSql;END;END;';EXEC sys.sp_executesql@Sql,N'@UserName sysname,@UserSid varbinary(85)',@UserName = @UserName,@UserSid = @UserSid;PRINTN'db_owner sichergestellt: ' +QUOTENAME(@UserName) +N' -> Login ' +QUOTENAME(@LoginName);SET @CopiedCount += 1;END/* ====================================================5.2 Benutzer WITHOUT LOGINBeispiel:CREATE USER [Auftragsverwaltung]WITHOUT LOGIN==================================================== */ELSE IF@UserType = 'S'AND @AuthenticationType = N'NONE'BEGINSET @Sql =N'USE ' +QUOTENAME(@TargetDatabase) +N';DECLARE @ExistingAuthentication nvarchar(60);SELECT@ExistingAuthentication =authentication_type_descFROM sys.database_principalsWHERE name = @UserName;/* ---------------------------------------------------------Benutzer existiert noch nicht.--------------------------------------------------------- */IF @ExistingAuthentication IS NULLBEGINCREATE USER ' +QUOTENAME(@UserName) +N'WITHOUT LOGIN;ENDELSE IF @ExistingAuthentication <> N''NONE''BEGINDECLARE @CollisionMessage nvarchar(2048);SET @CollisionMessage =N''Der Benutzer "'' +@UserName +N''" existiert bereits, ist aber kein Benutzer WITHOUT LOGIN.'';;THROW 51032, @CollisionMessage, 1;END;/* ---------------------------------------------------------db_owner sicherstellen.--------------------------------------------------------- */IF NOT EXISTS(SELECT 1FROM sys.database_role_members AS RMINNER JOIN sys.database_principals AS RON R.principal_id =RM.role_principal_idINNER JOIN sys.database_principals AS MON M.principal_id =RM.member_principal_idWHERER.name = N''db_owner''AND M.name = @UserName)BEGINDECLARE @RoleSql nvarchar(max);SET @RoleSql =N''ALTER ROLE [db_owner] ADD MEMBER '' +QUOTENAME(@UserName) +N'';'';EXEC sys.sp_executesql @RoleSql;END;';EXEC sys.sp_executesql@Sql,N'@UserName sysname',@UserName = @UserName;PRINTN'db_owner sichergestellt: ' +QUOTENAME(@UserName) +N' (WITHOUT LOGIN)';SET @CopiedCount += 1;END/* ====================================================5.3 Nicht automatisch reproduzierbarer BenutzerBeispiele:- verwaister SQL-Benutzer- contained database user- unbekannter AuthentifizierungstypKein Abbruch des gesamten Updates.==================================================== */ELSEBEGINPRINTN'WARNUNG: db_owner-Benutzer ' +QUOTENAME(@UserName) +N' wurde nicht übernommen. Typ=' +ISNULL(@UserType, N'?') +N', Authentifizierung=' +ISNULL(@AuthenticationType, N'?') +N', kein zugehöriger Server-Login gefunden.';SET @SkippedCount += 1;END;END TRYBEGIN CATCH/* ----------------------------------------------------Ein einzelner problematischer Benutzer darf dasgesamte FileIndex-Update nicht abbrechen.---------------------------------------------------- */PRINTN'WARNUNG: db_owner-Benutzer ' +QUOTENAME(@UserName) +N' konnte nicht übernommen werden. SQL Server: ' +ERROR_MESSAGE();SET @SkippedCount += 1;END CATCH;FETCH NEXT FROM DbOwnerCursorINTO@UserName,@LoginName,@UserType,@AuthenticationType,@UserSid;END;CLOSE DbOwnerCursor;DEALLOCATE DbOwnerCursor;/* ============================================================6. Abschluss============================================================ */PRINT N'';PRINT N'============================================================';PRINT N'WWS FileIndex Update abgeschlossen';PRINT N'============================================================';PRINTN'Hauptdatenbank: ' +QUOTENAME(@SourceDatabase);PRINTN'FileIndex: ' +QUOTENAME(@TargetDatabase);PRINTN'Neu angelegt: ' +CASEWHEN @DatabaseCreated = 1THEN N'Ja'ELSEN'Nein'END;PRINTN'db_owner gefunden: ' +CONVERT(nvarchar(20), @DbOwnerCount);PRINTN'db_owner sichergestellt:' +CONVERT(nvarchar(20), @CopiedCount);PRINTN'db_owner übersprungen: ' +CONVERT(nvarchar(20), @SkippedCount);PRINT N'============================================================'; -
Nach erfolgreichem Ausführen des Scripts und aktualisieren der Anzeige mit F5 sollte eine zusätzliche Datenbank mit der Endung
_FileIndexvorhanden sein. -
Starten Sie WWS MaX und führen Sie das Update durch. Die FileIndexDB wird nun automatisch genutzt.