尝试将 MSDB 恢复到替换服务器并收到以下消息:
消息 3168,级别 16,状态 1,第 4 行 设备 e:\sqlbackup\2024-02-27_msdb_DEV.bak 上的系统数据库备份无法还原,因为它是由不同版本的服务器创建的 ( 15.00.4335)比该服务器(15.00.4355)。消息 3013,级别 16,状态 1,第 4 行 RESTORE DATABASE 异常终止。
尝试将 MSDB 恢复到替换服务器并收到以下消息:
消息 3168,级别 16,状态 1,第 4 行 设备 e:\sqlbackup\2024-02-27_msdb_DEV.bak 上的系统数据库备份无法还原,因为它是由不同版本的服务器创建的 ( 15.00.4335)比该服务器(15.00.4355)。消息 3013,级别 16,状态 1,第 4 行 RESTORE DATABASE 异常终止。
我有几十个链接服务器、MSSQL、Teradata 和 Oracle。这些在 SQL Server 2019 上。Oracle 服务器正在使用 OraOLEDB.Oracle 19c 客户端。它们都是使用相同的参数化脚本创建的。
错误信息:
无法为链接服务器“XXXXXXX”创建 OLE DB 提供程序“OraOLEDB.Oracle”的实例。
编辑:适用于 Windows 管理员的登录名,但不适用于任何其他 SA 登录名。
错误号为 7302 但不是 DLL 注册问题
该脚本用于在 SQL Server 1 和 SQL Server 2 上创建链接服务器,在 #1 上一切正常。在 #2 上,MSSQL 和 Teradata 服务器很好,但 Oracle 服务器只能使用用于安装 Oracle 的帐户。我尝试将所有权利授予 Oracle base 和 Oracle Home 上的所有人进行测试,但这没有帮助。
所有链接服务器都设置为使用远程用户和远程密码进行所有登录。下面是执行 sp_addlinkedsrvlogin 的脚本部分。
SET @SQL = N'EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=@ServerName,@useself=N''False'',@locallogin=NULL,@rmtuser=@UserName,@rmtpassword=@Password'
EXEC $(TargetServer).master.dbo.sp_executesql
@stmt=@SQL
,@params = N'@ServerName nvarchar(250), @UserName nvarchar(250), @Password nvarchar(250)'
,@ServerName=@ServerName
,@UserName=@UserName
,@Password=@Password
我正在对 Oracle 的 OPENQUERY 执行 DELETE,然后执行 INSERT。我已经尝试过使用 WHERE 进行直接删除以及使用 JOIN 进行过滤。INSERT 只是一个 INSERT OPENQUERY/SELECT。我还尝试了过滤更新,然后在新行上插入。由于我不能对 OPENQUERY 进行 MERGE,因此我必须连续执行两个语句。
删除、更新和插入按预期工作,但前提是我间隔 10 分钟运行它们。单独地,它们在不到一秒的时间内完成。当使用 sp_executesql 或 SSMS 背靠背运行时,无论是单独运行它们还是在一个脚本中运行,它们都需要 10分钟。
与 Oracle DBA 交谈,没有为他敲响任何铃声。
查询本身,尽管我想分享它们以帮助您帮助我,但我没有这样做的自由。请相信我的话,当它们分开运行 10 分钟时,它们都可以在不到一秒的时间内按预期工作,而一起运行时则需要 10 分钟。
我编写了一个脚本,该脚本从中读取作业计划msdb.dbo.sysschedules
并运行sp_update_schedule
以更改active_start_time
给定作业子集的时间。在每种情况下,sp_update_schedule
都会失败并显示消息“指定的@schedule_id('xxx') 不存在”。(消息 ID 14262,严重性 16)
schedule id
insysschedules
不是它要找的东西吗?我在这里想念什么?
我的团队正在将具有大量链接服务器列表的 SQL 2012 服务器迁移到 SQL 2016。我的任务是编写在新服务器上创建链接服务器的脚本。
看起来我拥有在 sys.servers 中创建脚本所需的所有信息,但无法找到本地登录映射到链接服务器的位置。
我正在运行一个批处理文件,该文件启动一个 SQLCMD 脚本,该脚本从 TFS Release Manager 创建一个代理作业。
该脚本将 SQLCMD 参数分配给变量,使用选择列出变量,并在整个脚本的运行过程中显示一些反馈。
它看起来像这样:
SET NOCOUNT ON
DECLARE
@Var1 NVARCHAR(100) = '$(Var1)'
,@Var2 NVARCHAR(100) = '$(Var2)'
SELECT '@Var1' AS VarName,@Var1 AS VarValue
UNION ALL
SELECT '@Var2',@Var2
PRINT 'Do the first thing'
--delete sql agent job
PRINT 'Do the next thing'
--create sql agent job
PRINT 'Do the last thing'
--add steps
每隔一段时间,在输出中,我会在 SELECT 输出的中间看到 PRINT 消息。
有没有办法保证这些消息的顺序?
有没有办法找出 DACPAC 需要哪些参数?我知道如果您尝试不带参数发布,它们会列在错误消息中,但这需要很长时间 - 10-15 秒。此外,需要定位数据库以获取带有列表的错误消息。
有没有办法查询服务器是否参与可用性组?
还原具有多个文件的数据库时,SSMS 为您提供了还原为其他路径和文件名的选项。它如何从备份中检索文件列表?我可以在 SQL 脚本中这样做吗?C#?附言?
我正在使用具有许多跨数据库视图的数据库。虽然 INFORMATION_SCHEMA.VIEWS 列出了所有这些视图,但 INFORMATION_SCHEMA.VIEW_TABLE_USAGE 和 INFORMATION_SCHEMA.VIEW_COLUMN_USAGE 没有。
所有有问题的视图都采用以下格式:
CREATE VIEW [dbo].[Invoice]
AS SELECT * FROM [otherdb].[dbo].[Invoice]
以下查询返回 0 行:
SELECT
VIEW_CATALOG
,VIEW_SCHEMA
,VIEW_NAME
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE TABLE_CATALOG <> VIEW_CATALOG
将 SELECT * 的适当性留给另一个讨论,为什么外部数据库引用不在 INFORMATION_SCHEMA 视图中,有什么办法可以得到它们?
我想在不在数据库中创建新用户的情况下,将现有数据库上的 dbo 权限分配给现有登录名。我想让登录使用 dbo 用户,就像 sa 服务器角色的成员一样。
我发现的所有内容都涉及创建一个新的数据库用户。
谢谢!
我正在为单独的数据库中的视图创建许多代理视图。为了避免在两个地方定义视图,我想使用 SELECT * 创建代理视图。
我已经搜索了不这样做的原因,但没有找到任何原因。有人对使用 SELECT * 进行视图定义有意见吗?
给定一个 SourceTable 和一个 TargetTable,我想以编程方式创建一个包含所有所需连接的字符串。
简而言之,我正在尝试找到一种方法来创建这样的字符串:
FROM SourceTable t
JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn
JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn
我有一个查询,它返回给定表的所有外键,但是在尝试递归地运行所有这些以找到最佳连接路径并制作字符串时遇到了限制。
SELECT
p.name AS ParentTable
,pc.name AS ParentColumn
,r.name AS ChildTable
,rc.name AS ChildColumn
FROM sys.foreign_key_columns fk
JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id
JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fk.referenced_column_id
JOIN sys.tables p ON p.object_id = fk.parent_object_id
JOIN sys.tables r ON r.object_id = fk.referenced_object_id
WHERE fk.parent_object_id = OBJECT_ID('aTable')
ORDER BY ChildTable, fk.referenced_column_id
我确信这已经做过了,但我似乎找不到一个例子。
我正在使用 SQL Doc 来记录数据库的开发副本。SQL Doc 使用扩展属性来存储用户输入的值。在某些时候,我想将这些扩展属性复制到生产数据库中。做这个的最好方式是什么?
有没有像下面这样的好方法?
SQLCMD -S %SERVER% -E -Q "BEGIN TRANSACTION"
FOR %%f in (script1 script2 script3) do (
SET CURRENT_SCRIPT=%%f
SQLCMD -S Localhost -E -b -V 1 -i %%f.sql -o %%f.log
IF !ERRORLEVEL! NEQ 0 GOTO ERROR
SET CURRENT_SCRIPT=
)
SQLCMD -S %SERVER% -E -Q "COMMIT TRANSACTION"
我正在尝试优化一个 SSIS 包,该包从每天获取数百万条新记录的非常大的事务表中检索数据。数据是从数百台安装了 SQL Server 2008 Standard Edition 的现场服务器收集的。CDC,因此不能使用,因为它是企业功能。计划是这样的:
然后,SSIS 包将获取 Archive=0 的所有记录,将它们插入到目标中,然后获取 Archive=2 的所有记录并在目标中更新它们。
我需要帮助的是在 SSIS 过程完成写入新行或更新行后将存档列设置为 1。什么是设置所有已处理的行而不触及在初始选择之后可能已插入或更新的任何行的最有效方法?