在 SQL Server 中是否可以在不登录 SQL Server 的情况下确定是否启用了混合模式身份验证?
我注意到当您设置事务复制时,SQL Server 会将标识范围管理设置为手动。这意味着在我的订阅数据库中,当我尝试将一条新记录插入到 PK 是标识列的表中时,它会给我一个错误并说它试图插入一个“1”、“2”的 PK "、"3" 等。这是因为订阅者上所有标识列的当前标识值被重置为种子值(通常为 1),而不是保持在发布者上的值。
我理解 SQL Server 这样做的原因 - 您应该将订阅者表保留为只读。但是,我的场景有点不正统 - 我通过复制不时更新我的订阅者,立即备份该数据库,然后我想对订阅者进行一些不会被推回发布者的更新,然后当我再次更新订阅者时,我从较早的备份中恢复其数据库并提取最新更新。因为我想在这些更新之间对订阅者进行更新('临时增量',如果你愿意的话),我需要标识列工作,而不是在复制时重置为 1。
我在设置发布时尝试打开自动标识范围管理,但是当我尝试将表添加到发布时,这只会给我以下错误:
消息 21231,级别 16,状态 1,过程 sp_MSrepl_addarticle,第 2243 行
自动标识范围支持仅对允许更新订阅者的发布有用。
有什么办法可以解决这个问题吗?我确实想将此复制呈现给 SQL Server,就好像它在订阅者端是只读的一样,因为我不打算进行将推送回发布者的更新,但我确实想要进行临时更新将在下一次复制之前被擦除。
我还考虑过快照复制可能是比事务复制更适合我的使用模式的方法,但问题是快照复制需要每次更新都发送整个该死的数据库;因为我打算在最近一次复制后立即备份数据库,所以我不需要每次都进行整个传输;只是自上次以来的变化。
我试过在谷歌上搜索这个问题的答案,但一无所获。
我有一个 SQL Server 实例,其复制设置为FooDatabase
. 我有第二个实例,其复制设置FooDatabase
为第一个实例的订阅者。复制更新工作。我想要做的是备份订阅FooDatabase
,在订阅者实例上删除它,然后恢复备份。但是,当我这样做并尝试恢复备份时,出现以下错误:
服务器“DAVEG1525-162”的还原失败。(Microsoft.SqlServer.SmoExtended)
System.Data.SqlClient.SqlError: 无效的对象名称“master.dbo.MSreplication_options”。(Microsoft.SqlServer.Smo)
我已经检查过并且dbo.MSreplication_options
确实作为生产实例的master
数据库中的系统表存在,但不在订阅实例上。
我的问题是:如果订阅实例上不存在它,为什么它包含在从 SQL Server 订阅实例制作的备份中?我该如何解决这个问题?
replication backup sql-server-2008-r2 restore transactional-replication
如果排序规则是数据库默认值,SQL Server 似乎会不遗余力地删除COLLATE
对列的限制。nvarchar
我的数据库默认是SQL_Latin1_General_CP1_CI_AS
. 如果我这样创建一个表:
CREATE TABLE [dbo].[UserActive](
[Id] [uniqueidentifier] NOT NULL,
[DateCreated] [datetimeoffset](7) NOT NULL,
[Username] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Password] [nvarchar](max) NULL,
[Email] [nvarchar](254) NOT NULL,
CONSTRAINT [PK_UserActive] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
...然后要求 SQL Server Management Studio 将表编写为CREATE
语句,我得到以下结果:
CREATE TABLE [dbo].[UserActive]( …
Run Code Online (Sandbox Code Playgroud) 此查询有效:
DECLARE @Ordering NVARCHAR(50)
SET @Ordering = 'aggregateid'
DECLARE @OrderDirectionInt INT
SET @OrderDirectionInt = 0 --1
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY
CASE WHEN LOWER(@Ordering) = 'aggregateid' AND @OrderDirectionInt = 1 THEN AggregateId END DESC,
CASE WHEN LOWER(@Ordering) = 'aggregateid' AND @OrderDirectionInt = 0 THEN AggregateId END ASC
) AS RowNumber,
MyField
FROM
MyTable
) AS TempResults
WHERE TempResults.RowNumber BETWEEN 12 AND 23
Run Code Online (Sandbox Code Playgroud)
我不明白的是,为什么ASC
和DESC
在后(或外)的CASE
语句。看起来ASC
和DESC
被无条件地放入,这是没有意义的......它可能会解决:
ROW_NUMBER() …
Run Code Online (Sandbox Code Playgroud) sql-server ×4
backup ×1
collation ×1
logins ×1
replication ×1
restore ×1
security ×1
syntax ×1