将文件添加到文件组会引发错误,而使用文件组文件创建数据库工作正常

问题描述 投票:0回答:1

我使用 SQL Server 2022,想要将包含文件的文件组添加到现有数据库。我的计算机上还运行着 SQL Server 2019。

一开始我遇到了问题,因为我以管理员身份安装了 SQL Server,然后在笔记本上以“普通”用户身份启动了 SSMS。所以我以管理员身份执行 SSMS。然后我发现 SQL Server 用户无法访问我的本地目录,这就是为什么我将所有文件保存在 users/public 上...

我用:

  • Microsoft SQL Server Express(64 位)/16.0.1125.1
  • 在此版本上无法激活“AlwaysOn”
  • FileStream 在服务器级别激活
  • 数据库上的文件流访问级别为“FULL”
  • 文件组存在(当尝试将文件添加到文件组时)

这有效。

USE master
GO

CREATE DATABASE [Q8]
CONTAINMENT = NONE
ON PRIMARY 
( NAME = N'Q8', FILENAME = N'C:\Users\Public\SQLEXPRESS01\Q8.mdf' , SIZE = 10240KB , MAXSIZE = UNLIMITED, FILEGROWTH = 5120KB ), 
 FILEGROUP [FileGroup_SQLEXPRESS01_Q8] CONTAINS FILESTREAM  DEFAULT
( NAME = N'FileGroup_Q8', FILENAME = N'C:\Users\Public\SQLEXPRESS01\FileGroup_Q8' , MAXSIZE = UNLIMITED)
 LOG ON 
( NAME = N'Q8_log', FILENAME = N'C:\Users\Public\SQLEXPRESS01\Q8_log.ldf' , SIZE = 10240KB , MAXSIZE = 2048GB , FILEGROWTH = 5120KB )
 WITH CATALOG_COLLATION = DATABASE_DEFAULT, LEDGER = OFF
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [Q8].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [Q8] SET FILESTREAM( NON_TRANSACTED_ACCESS = FULL ) 
GO

这是我的脚本,用于创建数据库并随后添加文件组和文件到文件组

USE [master]
GO

 :SETVAR DatabaseName [Q80]

PRINT N'Run script on: ' + DB_NAME();

DECLARE @ProductVersion SQL_VARIANT = NULL;
DECLARE @ProductLevel SQL_VARIANT = NULL;
DECLARE @Edition SQL_VARIANT = NULL;
SELECT @ProductVersion = SERVERPROPERTY('productversion')
      ,@ProductLevel = SERVERPROPERTY('productlevel') 
      ,@Edition = SERVERPROPERTY('edition')
;
PRINT N'@ProductVersion: ' + TRIM(CAST(@ProductVersion AS NVARCHAR(100)))
PRINT N'@ProductLevel: ' + TRIM(CAST(@ProductLevel AS NVARCHAR(100))) 
PRINT N'@Edition: ' + TRIM(CAST(@Edition AS NVARCHAR(100))) 
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- SELECT * FROM sys.databases WHERE database_id = db_id(TRIM('[]' FROM '$(DatabaseName)'))

IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE database_id = db_id(TRIM('[]' FROM '$(DatabaseName)')))
  CREATE DATABASE $(DatabaseName) WITH CATALOG_COLLATION = DATABASE_DEFAULT;
GO
-- =============================================
-- Author:      Eva-Maria Segiet
-- Create date: 2021-06-24
-- Description: requirement: dba enabled filetable on server; preparing db for filetable...
-- Copyright (C) 2021 SPEKTRA GmbH Dresden
-- =============================================
USE $(DatabaseName)
DECLARE @Ret sql_variant;

-- EXEC @Ret = sp_configure 'show advanced options'
SELECT @Ret  = [value]  FROM sys.configurations  WHERE [name] = N'filestream access level'
PRINT CAST(@Ret AS NVARCHAR(10))
IF @Ret != 2
BEGIN
  EXEC sp_configure filestream_access_level, 2
  PRINT 'updated filestream_access_level to 2...'
  RECONFIGURE
END
ELSE
  PRINT 'filestream_access_level is already on 2...'
GO

-- SELECT db_id(TRIM('[]' FROM '$(DatabaseName)'))
-- SELECT * FROM sys.database_filestream_options WHERE database_id = db_id(TRIM('[]' FROM '$(DatabaseName)'))
-- SELECT * FROM sys.database_filestream_options WHERE database_id = db_id(TRIM('[]' FROM '$(DatabaseName)')) AND non_transacted_access_desc  = N'FULL'
IF NOT EXISTS (SELECT 1 FROM sys.database_filestream_options WHERE database_id = db_id(TRIM('[]' FROM '$(DatabaseName)')) AND non_transacted_access_desc  = N'FULL')
BEGIN
  PRINT N'Setting NON_TRANSACTED_ACCESS = FULL...'

  DECLARE @db_name NVARCHAR(128) = TRIM('[]' FROM '$(DatabaseName)')
         ,@server_name NVARCHAR(128) = REPLACE(REPLACE(@@SERVERNAME, '-', '_'), '\', '_')
         ,@SQLString VARCHAR(2000)
  ;
  --SELECT @server_name = REPLACE(@server_name, STRING_ESCAPE('\', 'json'), '_');
  PRINT @server_name
  PRINT @db_name
  SET @SQLString = CONCAT(N'ALTER DATABASE [', @db_name, '] SET FILESTREAM( NON_TRANSACTED_ACCESS = FULL )'
                         );
  PRINT @SQLString;
  EXECUTE( @SQLString );
END
GO
    -- >> reconnect to server / restart server

DECLARE @db_name NVARCHAR(128) = NULL -- '$(DatabaseName)'
       ,@server_name NVARCHAR(128) = @@SERVERNAME
         ,@SQLString VARCHAR(2000)
         ,@data_name NVARCHAR(128)
         ,@data_filename VARCHAR(2000)
         ,@filegroup NVARCHAR(128)
         ,@log_name NVARCHAR(128)
         ,@log_filename VARCHAR(2000)
         ,@filegroup_name NVARCHAR(128)
         ,@filegroup_filename VARCHAR(2000)
         ,@ContainerName VARCHAR(2000)
;

SELECT @db_name = TRIM('[]' FROM '$(DatabaseName)');
PRINT @db_name
SET @data_filename = CONCAT(N'C:\Users\Public\',@server_name,'\',@db_name,'.mdf');
SET @log_name = CONCAT(@db_name,N'_log')
SET @log_filename = CONCAT(N'C:\Users\Public\', @server_name,'\',@db_name,N'_log.ldf')
SET @filegroup = CONCAT(N'FileGroup_',REPLACE(REPLACE(@server_name, '\', '_'),'-','_'),'_',@db_name);
SET @filegroup_name = CONCAT(N'FileGroup_',@db_name);
SET @filegroup_filename = CONCAT(N'C:\Users\Public\',REPLACE(REPLACE(@server_name, '\', '_'),'-','_'),'\FileGroup_',@db_name,'\');

PRINT N'FileGroup: ' + @filegroup

-- Add a filegroup to the database using the following command
SELECT *, FILEGROUP_NAME(data_space_id) FROM sys.filegroups WHERE [name] = @filegroup
IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE [name] = @filegroup)
BEGIN
  PRINT N'Add FileGroup [' + @filegroup + '] CONTAINS FILESTREAM'
  SET @SQLString = CONCAT(N'ALTER DATABASE [', @db_name,'] ADD FILEGROUP [', @filegroup, '] CONTAINS FILESTREAM');
  PRINT @SQLString;
  EXECUTE( @SQLString )
END
ELSE 
  PRINT N'Aleady existing FileGroup [' + @filegroup + '] CONTAINS FILESTREAM'

-- Add a file to the database using the following command
SELECT * FROM sys.database_files
IF NOT EXISTS (SELECT 1 FROM sys.database_files WHERE type = 2 AND [name] = @filegroup_name)
  BEGIN
    SET @SQLString = CONCAT(N'ALTER DATABASE [', @db_name, N'] '
                           ,N'ADD FILE ( NAME = "', @filegroup_name, '", FILENAME = "', @filegroup_filename, '" ) '
                           ,N',( NAME = "', @filegroup_name, '_2", FILENAME = "', RTRIM(@filegroup_filename,'\'), '_2" )  TO FILEGROUP [', @filegroup, N']'
                           );
    PRINT @SQLString;
    EXECUTE( @SQLString )
  END

SELECT * FROM sys.database_files WHERE type = 2 AND [name] = @filegroup_name
GO

我收到此错误:

Meldung 35221,Ebene 16,状态 1,Zeile 84
Der Vorgang konnte nicht verarbeitet werden。 AlwaysOn-Verfügbarkeitsgruppenreplikate Manager 位于 SQL Server-Instanz 实例中。激活 SQL Server 配置管理器的 AlwaysOn-Verfügbarkeitsgruppen mithilfe。启动 SQL Server-Dienst neu,然后打开 Vorgang。有关 AlwaysOn-Verfügbarkeitsgruppen 的信息可在 SQL Server-Onlinedokumentation 中找到。

我还尝试在没有动态 SQL 的情况下执行脚本:

SELECT *, FILEGROUP_NAME(data_space_id) FROM sys.filegroups
--> FileGroup [FileGroup_GDD_NO_20_002_SQLEXPRESS01_Q80] exists (type=N'FD')
ALTER DATABASE [Q80]
ADD FILEGROUP [FileGroup_GDD_NO_20_002_SQLEXPRESS01_Q80]
CONTAINS FILESTREAM;
GO

--Add a file for storing database photos to FILEGROUP
ALTER DATABASE [Q80]
ADD FILE
(
  NAME= 'FileGroup_Q80',
  FILENAME = 'C:\Users\Public\GDD-NO-20-002\SQLEXPRESS01\FileGroup_Q80\'
  -- FILENAME = 'C:\Users\Public\GDD-NO-20-002\SQLEXPRESS01\FileGroup_Q80\Q80.ndf'
)
TO FILEGROUP [FileGroup_GDD_NO_20_002_SQLEXPRESS01_Q80];
GO

结果:

Meldung 35221,Ebene 16,状态 1,Zeile 132
Der Vorgang konnte nicht verarbeitet werden。 AlwaysOn-Verfügbarkeitsgruppenreplikate 的管理器位于 SQL Server-Instanz 实例中。激活 SQL Server 配置管理器的 AlwaysOn-Verfügbarkeitsgruppen mithilfe。启动 SQL Server-Dienst neu,然后打开 Vorgang。有关 AlwaysOn-Verfügbarkeitsgruppen 的信息可在 SQL Server-Onlinedokumentation 中找到。

sql-server filestream filegroup
1个回答
0
投票

这似乎是 SQL Server 2022 中的一个已知错误,您应该升级到最新版本。

有关更多详细信息,请参阅 https://learn.microsoft.com/en-us/troubleshoot/sql/releases/sqlserver-2022/cumulativeupdate1#1993393

修复完成的位置。

可以下载最新的 CU15 https://learn.microsoft.com/en-us/troubleshoot/sql/releases/sqlserver-2022/cumulativeupdate15

© www.soinside.com 2019 - 2024. All rights reserved.