标签: sql-server

身份列如何复制?

在事务复制期间,我们将数据从服务器 A 传输到服务器 B。

假设我们要在服务器 A 上的表上重新植入身份列(无论出于何种原因),这将如何影响服务器 B 上的数据?

我的直觉是,服务器 A 上的数据将使用新播种的身份,并将按原样发送到服务器 B(服务器 B 将具有使用新身份的内容),但我不确定这是否是正确的。

replication sql-server ssms identity

2
推荐指数
1
解决办法
4711
查看次数

如何检索给定表的捕获实例?

使用 SQL Server 2012,我有一个分层表布局 (TPT)。所有表都“继承”自同一个基表 ( dbo.DataObjects)。所有表都通过 CDC 启用历史记录跟踪。

我正在尝试编写一个通用函数,该函数返回给定类型的 CDC 历史信息,包括所有基表中的相关信息。

假设我的类型是直接继承自 的User表,我的查询应该如下所示:dbo.Usersdbo.DataObjects

DECLARE @Begin_LSN binary(10),@End_LSN binary(10) 
SELECT @Begin_LSN = sys.fn_cdc_get_min_lsn('dbo_Users') 
SELECT @End_LSN = sys.fn_cdc_get_max_lsn() 
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_DataObjects(@Begin_LSN, @End_LSN,'ALL') AS a 
JOIN cdc.fn_cdc_get_all_changes_dbo_Users(@Begin_LSN, @End_LSN,'ALL') AS b 
ON a.__$start_lsn = b.__$start_lsn
WHERE ID = 10;
Run Code Online (Sandbox Code Playgroud)

这将为我提供 ID 为 10 的用户的完整历史记录,包括基表中的列。

现在我想动态构建这种查询。

我的问题之一是 cdc 检索历史信息的函数包括捕获实例的名称:

cdc.fn_cdc_get_all_changes_<capture_instance>
Run Code Online (Sandbox Code Playgroud)

我还需要第二行中的捕获实例的名称来获取最小 lsn:

sys.fn_cdc_get_min_lsn('<capture_instance>') 
Run Code Online (Sandbox Code Playgroud)

当我为表启用 CDC 时,捕获实例名称会自动创建,或者手动传递。如果我不想自己跟踪捕获实例名称,有没有办法检索给定表的捕获实例的名称

我知道每个表可以有多个捕获实例(我认为最多 2 个),但我可能总是每个表只使用一个。

PS:我也知道捕获实例名称通常是以 的方式构建的<schema>_<table>,但依赖这种假设似乎有点冒险。未来版本的命名约定可能会发生变化,或者有人可以提供手动捕获实例名称/更改名称。

sql-server change-data-capture

2
推荐指数
1
解决办法
9331
查看次数

MSSQLSERVER 服务*未*启动,端口 1433 正在使用

如果之前有人问过这个问题,很抱歉提出。SQL Server 服务被定义为手动,每当我启动它时,我都会得到(事件查看器):

服务器 TCP 提供程序无法侦听 [“any”1433]。TCP 端口已被使用。

SQL Server (MSSQLSERVER) 服务因特定于服务的错误而终止

通常只允许每个套接字地址(协议/网络地址/端口)使用一次。

奇怪的是,我的以太网和 WiFi 适配器都禁用了 ipv6,但它已经运行良好多年了。

环境详情:

  • Windows 2008-R2;
  • SQL Server 2012 BI SP1;
  • 应用了所有 MSFT 补丁。

sql-server sql-server-2012 errors

2
推荐指数
1
解决办法
2万
查看次数

使用 THROW 发出警报

在我看来,SQL THROW 缺少一个重要的功能,那就是当错误号记录在应用程序日志中时可以触发警报的RAISERROR能力。WITH LOG

有没有一种简单的方法可以做到这一点,但我却无法做到这一点,还是我仍然必须依赖更麻烦的RAISERRORSP sp_addmessage

我希望能够通过THROW在块中使用的警报来通知操作员CATCH

sql-server alerts raiserror

2
推荐指数
1
解决办法
828
查看次数

应用程序执行时存储过程出现 ANSI_NULLS 和 ANSI_WARNINGS 错误

我有一个存储过程,在通过应用程序执行时出现以下错误:

异构查询需要为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项。这确保了一致的查询语义。启用这些选项,然后重新发出您的查询。

该存储过程SELECT中有一条语句连接到链接服务器表以返回结果。如果直接在SMS中执行这个存储过程,是没有任何问题的。如果我通过 ODBC 连接通过脚本执行存储过程,那么就没有问题。生成错误的唯一方法是当应用程序尝试执行它时。

查看应用程序时,没有错误。事实上,看起来运行成功,只是没有任何结果。我们能够识别此错误的唯一方法是运行 SQL 跟踪。

跟踪显示没有任何进程实际运行,相反,它只是立即出错并出现该错误。跟踪还表明它没有以不同的方式执行(例如exec sp_executesql或类似的方式)。我可以看到存储过程开始执行,然后出现错误,然后停止。

我对此进行了大量研究,答案似乎很简单,但没有任何效果。

我尝试将SET ANSI_NULLS ON&添加SET ANSI_WARNINGS ON到存储过程中,甚至将其移动到其中的不同位置。但始终没能成功

另外,尝试调整数据库级别设置 -

ALTER DATABASE [NGDevl] SET ANSI_NULL_DEFAULT OFF WITH NO_WAIT
GO
ALTER DATABASE [NGDevl] SET ANSI_NULLS OFF WITH NO_WAIT
GO
ALTER DATABASE [NGDevl] SET ANSI_WARNINGS OFF WITH NO_WAIT
GO
Run Code Online (Sandbox Code Playgroud)

但即使在重新启动 SQL 实例后也不起作用。

我唯一的另一个想法是让应用程序使用其中的设置部分执行过程,就像 ---

SET ANSI_NULLS ON;SET ANSI_WARNINGS ON;exec sp_storedproc 0,0,'A','0001'
Run Code Online (Sandbox Code Playgroud)

但不幸的是,我们无法控制应用程序来尝试这一点。

此外,重新创建了存储过程,以便将链接服务器所需的所有数据提取到临时表中,使其位于本地,然后加入到那里,但出现同样的问题。

你们有什么想法或可以在这里尝试吗?该错误似乎应该很容易修复,只是不确定我错过了什么。

sql-server sql-server-2012

2
推荐指数
1
解决办法
2万
查看次数

将存储过程的权限授予另一个架构中的表

我在 SQL Server 2012 数据库中创建了一个用户,并撤销了该角色授予的所有权限public

然后我授予了EXECUTE存储过程的权限。用户可以执行该过程,但无法获取其返回的数据。

该过程位于 中schema1,它从中选择的表位于 中schema2

如果我将用户添加到db_datareader角色,它可以从数据库中的所有表中读取所有数据。我尝试使用WITH EXECUTE AS OWNER但没有成功。

我怎样才能只授予对给定过程的访问权限而不授予其他任何权限?

schema security sql-server stored-procedures permissions

2
推荐指数
1
解决办法
5734
查看次数

T-SQL 基于标识列插入值

是否可以有一个基于 Identity 列的具有 PK 的表?

假设我有一个客户表,两个字段对于我们的案例很重要,Id即 isPK nvarchar(20)SequenceIdwhich is int identity(1,1)。我想要一个存储过程,该过程将具有(除其他外)一个参数@CustomerType,并根据此参数生成值Id并将新行插入表中。像这样的东西:

CREATE PROCEDURE createCustomer
@CustomerType int, 
@GivenName nvarchar(20), 
@Surname nvarchar(20), 
@BirthDate date = null
...
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @prefix nvarchar(1) = N'x'
    IF @CustomerType = 1
    BEGIN
        SET @prefix = N'P'
    END
...
    ELSE
    BEGIN
        SET @prefix = N'x'
    END

    INSERT INTO [dbo].[Customers]
           ([Id],
            [GivenName],[Surname],[BirthDate])
    VALUES
           (@prefix + (SequenceId + 1000000),
        @GivenName,@Surname,@BirthDate);

    SELECT INSERTED.Id AS CustomerId; …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server dml t-sql

2
推荐指数
1
解决办法
5252
查看次数

SQL Server 是否记录存储过程失败?

如何在 SQL Server Management Studio 2008 中查看给定时间范围内的存储过程错误列表?

sql-server-2008 sql-server t-sql

2
推荐指数
1
解决办法
1万
查看次数

多视图查询优化

我们有一个怪物视图,其中包含与许多(许多)表的联接,以便返回所需的数据。在某些情况下,为了获取一列信息,我们必须连接到 4 个表,只是为了获取我们需要的值(数据库结构不是很好,我们无法更改它)。

为了提高性能,我提取了某些组件并将它们构建到自己的视图中,以简化执行计划,并希望优化查询。

如果我编写一个将这些视图连接在一起的查询,我是否会失去每个视图的查询优化的好处?即,我最终会回到开始的地方,将视图组合成单个选择,还是因为它们彼此原子地起作用,所以它本身会表现得更好?

sql-server optimization sql-server-2000 view

2
推荐指数
1
解决办法
1505
查看次数

SQL Server REVOKE 需要 CASCADE

我有以下图表:

  • B 授予对 D 的选择,D 授予对 E 的选择,E 授予对 G 的选择。
  • B 已授予带有授予选项的选择,并且已授予带有授予选项的选择 D。
  • D 已授予带有授予选项的选择,并且已授予带有授予选项的选择 E。
  • E 已授予带有授予选项的选择,并且已授予带有授予选项的选择 G。

当我尝试撤销 D 上的 GRANT SELECT 时,出现错误,需要使用 CASCADE。

代码:

EXECUTE AS USER = 'userB';
GO
REVOKE GRANT OPTION FOR SELECT ON EMP FROM userD;
GO
REVERT;
Run Code Online (Sandbox Code Playgroud)

错误:

要撤销或拒绝可授予的权限,请指定 CASCADE 选项。

我需要的是删除 GRANT SELECT 而不删除 E 和 G 中的 GRANT SELECT。

sql-server permissions

2
推荐指数
1
解决办法
7263
查看次数