当我使用“sa”以外的其他用户登录数据库时,该用户名将在我下次登录时保留。
如果我输入用户名 sa 和密码然后登录,下次我打开该服务器的登录提示时,它不会记住我以 sa 身份登录,而是显示用户不是 sa。
为什么?
我们的组织中有三个独立的用户组(开发、支持、实施)。就目前情况而言,每个人都使用一次登录来完成所有事情。我们正开始摆脱这种情况。每个人都通过自己的登录名访问数据库,每个人都可以访问其组系统。因此,支持人员可以访问支持职能和工作等。
过程和表的允许权限非常简单。从 windows 组创建登录名。然后根据该登录创建一个用户,并允许它在我们为他们创建的新架构上读取和执行。
我们正在运行 SQL Server 2012 和 2008 R2。
SQL 代理作业位于用户级别之上,需要将登录名分配给所有者。但它不接受组登录作为接受的参数:
指定
@owner_login_name无效(有效值由sp_helplogins[不包括Windows NT 组]返回)。
希望允许这些组拥有自己的一组可以直接操作的作业(在报告服务器上而不是实时数据库上)。不影响其他部门的工作或其他工作(数据库维护任务、复制等)。但如果原始作者不在办公室或已经离开,则允许团队的其他成员操纵工作。
我尝试过四处搜索,但到目前为止,我在 2010 年在sqlservercentral.com上发现的唯一一件事说这是无法完成的。
将 SQL 代理作业分配给无人有权访问的支持/开发通用帐户。但每个人都可以以某种方式操纵自己的工作。
这将允许人们改变团队的工作,同时允许个人离开公司后继续使用工作。
我还没有找到一种方法让人们能够通过其他所有者访问/运行作业(即使他们使用相同的 Windows 组登录到 sql)。不授予他们SQLAgentOperateorRole (这会破坏将他们锁定在外的意义)彼此(和管理员)的工作。
每个组创建一个用户,该用户具有 msdb 权限的附加访问权限以及他们可以登录以操作作业的标准支持功能。
这样做的缺点是现在用户有两个登录名,其中之一不会改变。因此,离开公司的用户仍然可能拥有该帐户的登录凭据,这也会导致用户变得懒惰,只在该帐户下登录。(他们不应该这样做,但说实话,他们会的)。
每个组都有一个每 5 分钟运行一次的 SQL 作业,其中包含一个表,其中包含用于以频率 x 运行此命令的命令(本质上一个 SQL 代理作业运行自定义编写的 SQL 代理作业列表)。
我认为我不需要经历这是一个多么可怕的想法。但这是已经半考虑过的事情。
显然,我们可以看到的最佳解决方案是允许一个组拥有 SQL 代理作业,但似乎这是不可能的。
有人有主意吗?目前,我们将不胜感激有关如何实施此类事情的指导。
permissions sql-server-2008-r2 sql-server-2012 sql-server-agent
我有一个通过事务复制复制的表,该表抛出此错误消息:
\n\n\n\n\n要复制的 LOB 数据长度 (68983) 超过配置的最大值\xc2\xa065536。
\n
这可以通过调整“最大文本重复大小 (B)”SQL 配置值(默认值 65536)来解决。
\n\n我看到两个选择:
\n\n我的问题是:将“最大文本重复大小 (B)”设置为 -1 有什么缺点?
\n\n我很感激任何反馈!
\n基于 WHERE 子句中的按位比较对列进行索引以进行有效查找的最佳方法是什么,例如
SELECT ID, FLAGS, NAME FROM TABLE WHERE FLAGS & 4 = 4
Run Code Online (Sandbox Code Playgroud)
我的环境是SQL Server 2012。
据我了解,此类查询中不会使用 FLAGS 列上的索引。
我知道另一个选择是将 FLAGS 列分解为单独的列,但我想避免这种情况,因为在某些情况下,这意味着 25 个以上的新列,每个列都需要索引组合来支持常见查询。
有没有什么方法可以对单列建立索引以使按位查询更有效?
我尝试按照下面 dudu 的建议使用带有索引的计算列,但是当我在具有聚集索引的表上使用并开始选择列(而不是仅仅选择 count(*) 时,它不再使用该索引新的计算列。
SELECT
*
INTO
MYTABLE
FROM
(
SELECT 'A' COL_A, 'A' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'B' COL_A, 'D' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'C' COL_A, 'S' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'D' COL_A, 'F' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'E' …Run Code Online (Sandbox Code Playgroud) 我需要确认我们的 SQL Server 中是否曾经存在过一个特定的表。是否存在可用于列出 SQL Server 实例中所有删除的数据库的现有脚本或方法?
我们为连接到其 SQLServer 数据库的客户编写了一个简单的“客户端”应用程序,对“属性”运行大约 360 次查询,并将该数据作为我们称为“cProp”的 .Net 对象返回。
查询的复杂性各不相同,但最长的可能需要 400 毫秒。当我们最近为 60 个属性运行它时,整个运行大约需要 3 分钟。客户决定将他们的数据库移动到我们之间 65 毫秒的远程服务器。结果,相同的查询需要 51 分钟。
现在我 99% 确定问题是行检索,但我需要证明这一点。DBA 对该过程进行了跟踪,但之前从未使用过它,我很沮丧地发现它包含的信息如此之少。我所看到的是,它花了不到 4 分钟的服务器时间。这加强了我的信念,即问题出在行检索上。
但我如何衡量呢?跟踪不返回关于行数或总数据大小的任何信息 - 我做错了吗?我也知道批处理发生在服务器之外,那么我们如何知道那里发生了什么?一般来说,可以这么说,如何调试“服务器外部”发生的问题。
我创建了两个对应于两个 Windows 组的 SQL Server 登录名:
MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)
然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。
在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccount到MachineName\MyAppAmdin组中。
现在我可以通过 Windows 身份验证通过MyDomain\MyAccount.
问题是,我想确切地知道我正在使用哪个 Windows 组登录,但我不知道如何。
我试过:
ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions
Run Code Online (Sandbox Code Playgroud)
以上所有内容都会返回MyDomain\MyAccount,但我需要知道的是我是否通过MachineName\MyAppAmdin.
总结一下,我的问题是:
有没有办法准确判断当前连接使用的是哪个 Windows 组登录(或用户)?
或者有什么方法可以检查是否MyDomain\MyAccount与特定用户或登录名相关联?
我知道我可以使用 C# 或命令来解析域帐户是否属于特定的 Windows 组,但是我们有一些新的 IT 策略,所以我正在考虑使用 TSQL 实现类似结果的方法。
假设我们有一个Orders包含列的表order_id, total, discount
然后我们写一个类似于下面的查询
SELECT
COUNT(order_id) AS num_orders
, SUM(total) / COUNT(order_id) as avg_total
, SUM(discount) / COUNT(order_id) AS avg_discount
FROM Orders
Run Code Online (Sandbox Code Playgroud)
COUNT(order_id)Preserved的值是跨列还是重新计算(例如,是否有性能影响)?或者最好先确定计算值并在查询中使用这些值,例如:
DECLARE @order_count AS INT
SELECT
@order_count = COUNT(order_id)
FROM Orders
SELECT
@order_count AS num_orders
, SUM(total) / @order_count as avg_total
, SUM(discount) / @order_count AS avg_discount
FROM Orders
Run Code Online (Sandbox Code Playgroud)
请注意,在编写此问题时,我注意到由于AVG()支持SQL Server 2008 。但是,我继续了这个问题,并打算更一般地想了解 SQL Server 如何处理跨列的相同聚合,因为我有时会以其他形式遇到这个问题。
我看到 SQL Server 中的默认系统健康会话事件是 5 MB,每个事件总共有 4 个文件。
我们正在尝试从历史事件中的系统健康状况中获取数据,但对于一些关键的生产服务器,它们只会非常快速地滚动。对有些人来说,他们甚至在那里呆了几个星期
SQL Server 中滚动文件的机制是如何工作的,有没有一种方法可以检查这种情况何时以及如何发生?
编辑@每个答案
因此,我认为系统运行状况中可能会捕获很多不需要的事件。我怎样才能在这个系统运行状况中找到它们并过滤掉它们?
另外,我们应该增加文件大小,比如 200 MB 4 文件,还是只保留 10 MB 80 文件等小文件?哪一个更好?
更新@我已经将此标记为答案,但是在检查弹出的另一件事时:
文件未按顺序填写;假设我将 10 个文件增加到每个 10 MB。我们看到几天前的 1-6 个文件似乎都充满了 10 MB,而同一天的文件 7 和 8 是 2 MB,而文件 9 和 10 完全充满了 10 MB。我想这是意料之中的,只是好奇为什么会这样?
过去几周,我们一直在努力找出导致这些 I/O 问题和检查点变慢的可能原因的根本原因。
乍一看,这显然是 I/O 子系统错误,应该归咎于 SAN 管理员。但最近我们将 SAN 更改为使用全闪存,但截至今天,错误仍然弹出,我不知道为什么,因为我运行的每个指标,无论是等待统计数据还是任何其他指标,都是为了检查 SQL 服务器是否可行罪魁祸首似乎恢复正常。
它并没有真正加起来。也很可能是其他东西正在咀嚼磁盘并且 SQL Server 在这里成为受害者......但我无法找出什么?
数据库位于可用性组中,当这些事件发生时,我们确实会看到角色更改和翻转以及超时发生。
任何帮助解决这个问题将不胜感激。如果需要任何进一步的细节,请告诉我。
错误消息。以下
SQL Server 在数据库 [ABC] (7) 中的文件 [E:\MSSQL\DATA\ABC.mdf] 上遇到了 14212 次 I/O 请求需要超过 15 秒才能完成。操作系统文件句柄是 0x0000000000000D64。最新的long I/O的偏移量为:0x0000641262c000
SQL Server 在数据库 [XYZ] (7) 中的文件 [E:\MSSQL\DATA\XYZ.mdf] 上遇到了 5347 次 I/O 请求需要超过 15 秒才能完成。操作系统文件句柄是 0x0000000000000D64。最新的long I/O的偏移量为:0x0000506c060000
FlushCache:在 925084 毫秒内清理了 111476 个 buf,其中 62224 次写入(避免了 19 个新的脏 buf),用于 db 7:0 平均吞吐量:0.94 MB/秒,I/O 饱和度:55144,上下文切换 98407 最后一个未完成的目标:101241077 次写入FlushCache:在 248687 毫秒内清理了 5616 个 buf,其中 3126 个写入(避免了 3626 个新的脏 buf),用于 …
performance sql-server storage san sql-server-2012 performance-tuning
sql-server-2012 ×10
sql-server ×9
performance ×2
index ×1
logins ×1
permissions ×1
san ×1
security ×1
ssms ×1
storage ×1
t-sql ×1