标签: sql-server-2012

如何检测授予角色的执行权限(未使用 ON 子句时)

我只是花了几个小时试图弄清楚应用程序如何有权限执行存储过程。

来自 StackExchange 的TIL:事实证明该ON子句对于 是可选的GRANT,允许授予角色对所有内容执行。在我尽力验证语法之后,我不得不嘲笑这个 MSDN 页面的最底部。

授予对象权限 (Transact-SQL)

CREATE ROLE Test
GRANT EXECUTE TO Test
Run Code Online (Sandbox Code Playgroud)

好的,这很酷(不是最小特权原则)。

但是:我如何发现或检测该授权?

我尝试查看所有 SQL Server Management Studio 登录名、角色、用户和架构权限 GUI,但在任何地方都没有发现这种类型的授权。

在调试时,我发现了有关在查询中枚举权限的问题,虽然这些问题是相关的,但这里的答案既没有提到也没有涵盖这种情况:

我正在寻找识别这种授予(或拒绝)特权方法的最可靠方法。

sql-server permissions role sql-server-2012

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

添加日期时间时交叉应用失败

在尝试实现将Pivot两行数据表合并为一行的-ed 目标时,我的第一个想法是使用Cross Apply. 通过使用Cross Apply可以识别/生成具有从行的唯一 id 派生的特定列名的每一行。(例如,“纬度”源列的“纬度1”和“纬度2”)。

当我使用INTorFLOAT数据类型时一切都很好,但是当我尝试使用DateTimeall VALUESbecome 时DateTime


示例运输纬度/经度/日期时间

我们在两个不同的日子报道了船舶旅程中的两点:

CREATE TABLE #Shipping
(
     [RouteID]     [INT]  NOT NULL,
     [Latitude]    FLOAT NOT NULL, 
     [Longitude]   FLOAT NOT NULL,
     [Time]        DATETIME NOT NULL

);

INSERT #Shipping(RouteID, [Latitude], [Longitude], [Time])
VALUES          (1,         18.0221,    -63.1206,  '24-Jan-2016'), 
                (2,         17.8353,    -62.99667, '25-Jan-2016');
Run Code Online (Sandbox Code Playgroud)

成功的交叉应用 如果我们CrossApply对前三列的数据使用

  SELECT  col+cast([RouteID] as varchar(1)) new_col
         , X.value
       FROM #Shipping
  CROSS APPLY
  (
      VALUES
         (RouteID, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012 cross-apply

7
推荐指数
1
解决办法
1089
查看次数

按升序和降序划分

我有一个表,对于一组给定的字段 a、b 和 c,我需要获取按 d 和 e 排序的第一行和最后一行,并且正在使用 ROW_NUMBER 来获取这些行。声明的相关部分是...

ROW_NUMBER() OVER (PARTITION BY a,b,c ORDER BY d ASC, e ASC) AS row_number_start,
ROW_NUMBER() OVER (PARTITION BY a,b,c ORDER BY d DESC, e DESC) AS row_number_end
Run Code Online (Sandbox Code Playgroud)

执行计划显示了两个排序操作,每个操作一个。这些排序操作占语句总成本的 60% 以上(我们在这里谈论的是数千万行,分区通常每个分区有 1-100 条记录,大部分在 10 条以下)

所以如果我能摆脱其中的一个就好了。我试图创建一个索引来复制排序;这消除了排序操作之一,但没有消除后者。(请注意,创建的任何索引仅用于此过程,并且会作为 ETL 过程的一部分每天重新创建。)

从检查执行计划来看,我认为问题是在执行partition by语句时,SQL Server坚持按分区列升序排序。从逻辑上讲,是升序还是降序都没有关系,如果优化器理解这一点,那么它可以向后读取相同的索引来计算 row_number_end。

有什么方法可以让优化器在这里看到意义,或者有人可以建议另一种方法来实现相同的最终目标吗?

sql-server sql-server-2012 greatest-n-per-group

7
推荐指数
1
解决办法
7405
查看次数

如果它是一个堆,一个表会受益吗

我有一个大约有 1.500.000 行的日志记录表,主键是一个升序标识,聚集索引在主键上。标识值是自动生成的 => 记录总是添加在最后。平均行大小为 1570 字节。

由于频繁添加新行,因此有很多页面拆分。没有行被更新/删除,并且表上有一个非聚集索引,因此可以选择行。由于页面拆分,聚集索引总是碎片化 > 65%。

我想知道我的表是否会因删除聚集索引并使其成为堆表而受益?

这是我的表 + 非聚集索引的样子:

CREATE TABLE [dbo].[LogEntry](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Application] [varchar](20) NOT NULL,
[EntityFullName] [varchar](80) NOT NULL,
[Action] [int] NOT NULL,
[UserName] [varchar](25) NOT NULL,
[TimeStamp] [datetime] NOT NULL,
[EntityId] [varchar](50) NOT NULL,
[WhatChanged] [nvarchar](max) NULL,
CONSTRAINT [PK_LogEntry] PRIMARY KEY CLUSTERED(     
   [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY] ) 
ON [PRIMARY] …
Run Code Online (Sandbox Code Playgroud)

sql-server clustered-index index-tuning heap sql-server-2012

7
推荐指数
1
解决办法
1290
查看次数

有没有办法查看 SQL Server 2012 如何定义新身份?

关于Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64),有没有办法查看 SQL Server 使用什么机制来计算由创建的表的新标识值SELECT INTO


样本数据

-- Create our base table
CREATE TABLE dbo.A
(A_ID INT IDENTITY(1, 1),
x1 INT,
noise1 int DEFAULT 1,
noise2 char(1) DEFAULT 'S',
noise3 date DEFAULT GETUTCDATE(),
noise4 bit DEFAULT 0);

-- Create random data between the range of [0-3]
INSERT INTO dbo.A(x1)
SELECT s1000.n FROM
( SELECT TOP (10) n = 1 FROM sys.columns) AS s10 -- 10
CROSS JOIN
( SELECT TOP …
Run Code Online (Sandbox Code Playgroud)

sql-server database-internals identity sql-server-2012

7
推荐指数
1
解决办法
629
查看次数

将大表复制到存档表 SQL Server 2012

我有一个包含我的应用程序日志的表,它有 161.626.718 行(并且还在增长),并且在其上进行插入非常慢。我的想法是只保留表中 6 个月的日志和所有我想复制到应用程序无法访问的存档表上的旧记录,如果有人需要一些信息,只需直接在表上进行选择。因此,我们的想法是创建这样的日常工作:

SELECT * INTO audlog_backup FROM audlog WHERE XDATE <= DATEADD(day,-185,GETDATE())

DELETE FROM audlog WHERE XDATE <= DATEADD(day,-185,GETDATE())
Run Code Online (Sandbox Code Playgroud)

但是由于表的大小,这将花费很长时间,并且在第一次运行时会减慢甚至锁定数据库一段时间,毕竟大多数行将超过 6 个月。

第一次尽可能安全和快速地做这件事的建议是什么?

更多信息:

SQL Server 2012 标准版

创建表的脚本:

CREATE TABLE [dbo].[audlog_backup](
    [PVKEY] [float] NULL,
    [DKEY] [varchar](14) NULL,
    [XDATE] [datetime] NULL,
    [XTIME] [varchar](8) NULL,
    [XFROM] [varchar](50) NULL,
    [XTO] [varchar](50) NULL,
    [DETAILS] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
SET ANSI_PADDING ON
ALTER TABLE [dbo].[audlog_backup] ADD [XUSER] [varchar](50) NULL
ALTER TABLE [dbo].[audlog_backup] ADD [PEOPLEKEY] [int] NULL
ALTER TABLE …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012

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

我的类型/子类型设计模式(对于互斥子类)的实现是否正确?

介绍

为了让这个问题对未来的读者有用,我将使用通用数据模型来说明我面临的问题。

我们的数据模型由两个实体组成,它们应标记为AB。为了简单起见,它们的所有属性都将是int类型。

实体A具有以下属性:DX;实体B具有以下属性:DY

问题

由于两个实体共享共同的属性D,我决定应用类型/子类型设计。

我不确定我的实现是否正确,因此我在这里要求进行设计审查。

我的实现

-- lookup table for discriminator column
CREATE TABLE ClassType
(
  ClassTypeID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Class_Description VARCHAR(50) NOT NULL
);

-- inserting types A and B from our example 
INSERT INTO ClassType (Class_Description)
VALUES ('A'), ('B');

-- creating base class table
CREATE TABLE BaseClass
(
  BaseClass_ID INT …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server sql-server-2012 subtypes

7
推荐指数
1
解决办法
1049
查看次数

(Ola Hallengren) 删除早于上次完整备份的日志备份

当我将 Ola Hallengren 的备份脚本部署到我的服务器时,我总是将@CleanupTime日志备份的参数设置为零。这样,每次运行日志备份作业时,它都会检查早于上次完整备份的日志备份文件并将其删除。但是,对于完整COPY_ONLY备份也是如此!COPY_ONLY为了删除旧的日志备份文件,日志备份作业应该只检查最后一次非完整备份。

只是想知道我是否是唯一遇到这种情况的人,或者我的建议是否合理。如果我需要在中间进行完整副本备份以 IDK 刷新 TEST 数据库,则该仅副本备份不应影响常规的每日备份顺序。请让我知道你的想法。

sql-server backup maintenance sql-server-2012 ola-hallengren

7
推荐指数
1
解决办法
4250
查看次数

每次事务日志已满时,数据库进入恢复模式

我面临的情况有点难以解决。我需要帮助来了解正在发生的事情。

TL;DR:每次 SQL Server 中的事务日志已满时,它都需要关闭数据库以进入恢复模式并回滚有问题的事务吗?这总是由设计完成还是仅在发生不好的事情时才会发生?


场景:

我们大量使用的生产数据库之一,它运行多个 ETL 作业和长时间运行的表批处理,进入恢复模式并在一段时间内无法访问。这周发生了 3 次(这个服务器已经运行了大约 2 年,我们过去没有注意到这个问题)。

查看错误日志很清楚发生了什么:事务日志已满,数据库需要回滚事务,回滚失败,数据库关闭,并以恢复模式启动。

DBA 认为这是 SQL Server 的正常行为。也就是说,按照他的说法,每次事务日志满了,一个事务需要回滚,数据库就会因为日志空间不足而进入恢复模式。回滚后(根据他的说法只能在恢复模式下完成),数据库将再次可用。

我找不到此信息的参考。所以我强烈反对。如果有人让我相信我错了,我将不胜感激。

我的观点:

据我所知,DBMS 是用来管理/运行查询的。如果空间不足,查询将失败。就这么简单。我不是在谈论其他任何东西的性能,而只是在谈论可用性。

接受 DBMS在设计上需要关闭自身以回滚任何事务对我来说是没有意义的。根据我的理解,我是否正在运行大量查询或查询设计是否不当都无关紧要。错误的查询应该会失败,而生活仍在继续。不是吗?

我的猜测是其他原因导致它失败,我需要跟踪正在发生的事情。

我的理解是错误的还是这真的是 SQL Server 的设计方式?假设我没有错,我还能做些什么来追踪这个问题的来源?


一些附加信息

  • select @@version:Microsoft SQL Server 2012 (SP1) - 11.0.3156.0 (X64) 2015 年 5 月 4 日 18:48:09 版权所有 (c) Windows NT 6.2(内部版本 9200:)微软公司标准版(64 位)
  • 此数据库处于简单恢复模式。
  • 同一个实例中还有其他数据库。它们没有出现相同的问题,但它们也没有被大量使用。
  • 只有事务日志已满,磁盘未满。磁盘有足够的空间,但数据库的日志大小有限。
  • 我们监控这台服务器,CPU 负载正常,内存使用正常,磁盘使用 RAID-5,控制器没有崩溃或读取失败。资源使用有一些高峰,但并不少见。
  • 我知道可以改进查询以有效地使用日志。我也知道我可以增加事务日志空间。但这真的不是我的重点。
  • 最近聘请了一位 DBA 来管理这个数据库。所以最近更改了几个配置,用于调整目的。他让我知道所有的变化(比如禁用自动收缩、增加自动增长大小等)。我没有发现任何可能损害数据库的内容。

日志转储(按发生顺序,删除重复项)

[02:58:37am ~ …

sql-server sql-server-2012 transaction-log recovery-model

7
推荐指数
1
解决办法
5201
查看次数

重新排列 OR 条件时,SQL Server 创建不同的计划

我正在审查一个性能不佳的查询,如下所示:

WHERE manymany.Active = -1
  AND manymany.Check1 = -1
  AND manymany.WebsiteID = @P1
  AND CURRENT_TIMESTAMP BETWEEN ISNULL(manymany.FromDate, '1950-01-01') AND ISNULL(manymany.UptoDate, '2050-01-01')
  AND main.Active = -1
  AND main.StatusID = 1
  AND CURRENT_TIMESTAMP BETWEEN main.FromDate AND ISNULL(main.UptoDate, '2050-01-01')
  AND (main.TextCol1 IS NOT NULL OR main.TextCol2 IS NOT NULL)
ORDER BY aux.SortCode
Run Code Online (Sandbox Code Playgroud)

我不小心在这个查询上使用了 SSMS 查询设计器,它重新编写了查询,如下所示:

WHERE manymany.Active = -1
  AND manymany.Check1 = -1
  AND manymany.WebsiteID = @P2
  AND CURRENT_TIMESTAMP BETWEEN ISNULL(manymany.FromDate, '1950-01-01') AND ISNULL(manymany.UptoDate, '2050-01-01')
  AND main.Active = -1
  AND main.StatusID = 1 …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization execution-plan sql-server-2012

7
推荐指数
1
解决办法
171
查看次数