我正在尝试创建一个审核日志以在 MSSQL 2012 上的某些表上存储所有删除命令。
我需要的是执行它的用户名和执行的命令,然后我可以将它们插入到日志表中。
我找到了许多创建触发器的示例,但没有一个显示如何检索这些信息。
我正在尝试创建一个审核日志以在 MSSQL 2012 上的某些表上存储所有删除命令。
我需要的是执行它的用户名和执行的命令,然后我可以将它们插入到日志表中。
我找到了许多创建触发器的示例,但没有一个显示如何检索这些信息。
我的 Active Directory 帐户位于 msdb 的 SQLAgentOperatorRole 上的 AD 组中。我可以列出现有的 MSSQL 代理作业,但我只能查看它们的步骤和时间表,我无法编辑它们或创建新的。
我能够创建新作业,但是在他们的步骤中,当我选择 CmdExec 时,没有列出任何代理。
如果我从 SQLAgentOperatorRole 中删除该组,则不再列出任何作业。
当我登录时,sa
我可以编辑作业并列出代理。
我是否缺少能够管理工作的东西?
列出给定角色的所有权限?有一个很好的查询来列出用户及其在数据库中的角色。
我们如何列出所有表和用户及其对这些表的权限?
我使用 .NET 在 SQL Server 2014 上执行 SQL 操作,这是使用的代码:
using(SqlConnection conn = new SqlConnection(connectionString)){
//https://stackoverflow.com/questions/1880471/capture-stored-procedure-print-output-in-net
conn.InfoMessage += new SqlInfoMessageEventHandler(logSqlMessages);
conn.Open();
using(SqlCommand stmt = new SqlCommand{
Connection = conn,
CommandText = sql,
CommandTimeout = 30000 // The time in seconds to wait for the command to execute. The default is 30 seconds.
//,CommandType = CommandType.StoredProcedure
})
{
affectedRecords = stmt.ExecuteNonQuery();
} // using stmt
} // using conn
当我查看 Active Monitor 时,有数十行引用相同的操作。它们都具有相同的session_id
,其中一些具有正在运行的任务状态,并且大多数都处于挂起状态。其中一些有 LastWaitTime CXPACKET
,大多数是PAGEIOLATCH_SH
.
我还在 SQL Server 上运行了一个查询,并且在 Active Monitor 上发生了同样的行为。
也许这是它的正常行为,但奇怪的是 SELECT 操作会创建多行并像这样阻塞自己。知道是什么原因造成的吗?
我想创建第二个日志文件,但错误地创建了一个数据文件。
现在我试图删除它,但我收到错误消息“无法删除文件,因为它不为空”。以下查询列出了很多表:
SELECT o.name AS TableOrIndex
FROM sysfiles f
JOIN dbo.sysfilegroups s
ON f.groupid = s.groupid
JOIN dbo.sysindexes i
ON i.groupid = s.groupid
JOIN dbo.sysobjects o
ON i.id = object_id(o.name)
AND i.indid in (0, 1)
WHERE f.name = 'DB_NDF_FILE'
UNION
SELECT i.name
FROM sysindexes i join sysfilegroups f ON i.groupid = f.groupid
JOIN sysfiles l ON f.groupid = l.groupid
WHERE l.name = 'DB_NDF_FILE'
将这些数据移动到其他数据文件的正确步骤是什么,以便我可以安全地删除这个新创建的文件?
哪个数据库角色成员授予执行 SQL Server 2012 中所有现有存储过程的权限?
我尝试为每个用户添加一个用户,但仍然无法执行存储过程。我不想分别授予EXECUTE
每个存储过程,我想将用户添加到一个角色,并且他能够执行其中的任何一个。
我正在从日期以“DDMMYYYY”格式表示的文件开发ETL,例如“31012016”。
我想获取这个字符串并将其直接传递给将插入数据的 SQL 文本。我不想将其解析为 C# DateTime 然后将其格式化为“YYYY-MM-DD”,以便 SQL Server 再次解析它。
正如我目前所做的那样,日期字符串由 .Net 解析一次,然后由 .Net 格式化并打印在 SQL 代码中,然后由 SQL Server 再次解析。我想从平面文件中获取字符串并将其直接放入 SQL 代码中,无需任何转换。
SQL Server 识别“YYYYMMDD”,但“DDMMYYYY”失败并显示以下消息:
从字符串转换日期和/或时间时转换失败。
例子:
DECLARE @datevar date = PARSE('31012016' as date using 'pt-BR');
SELECT @datevar;
有什么办法让它工作吗?
我试过PARSE('31012016' as date using 'pt-BR')
但引发了异常。TRY_PARSE
返回空值。还尝试了 CAST 和 CONVERT (Transact-SQL),但似乎不存在这种风格。
我使用 SSMS 2012 v11.0.5058.0。
MSDN说“系统表、视图或表值函数”应该是绿色的。我习惯在变量和其他一些标记类型中使用绿色。但是我的 SSMS 将它们作为原始值保留为黑色。
我按照更改字体颜色、大小和样式尝试设置默认值,但没有解决。我也尝试手动设置它们,但没有找到它们可供选择。
知道可能是什么问题吗?
在打开.sql
文件或让 SSMS 为表创建选择查询的两种情况下都会发生这种情况。即使[]
列名周围有。即使在重新启动 Windows 后它仍然存在。
我使用sys.dm_db_index_usage_stats.last_user_seek
,sys.dm_db_index_usage_stats.last_user_scan
和sys.dm_db_index_usage_stats.last_user_lookup
查询上次读取表的时间。
对于我正在使用的视图、函数和存储过程,sys.objects
但它没有任何用于读取日期时间的字段。
是否有任何系统表可以让我看到上次读取/使用这些类型的对象的时间?
我的目标是找到未使用的对象并可能丢弃它们。
我们有 3 个 SQL Server 2012 实例,其中 2 个不是db_owner
. 我们的一些存储过程使用 DMV 和sys
视图以及仅在本地执行时才起作用的存储过程。
我想在我们的主实例中集中执行这些(我们的)存储过程,并从中远程执行这些存储过程。我尝试使用 SQL Server 代理作业,但它需要一些我不习惯的配置,而且可能无论如何都无法访问。
有什么方法可以远程执行存储过程,最好使用链接服务器?
编辑:我们可以使用链接服务器,openrowset
任何可以在简单 SQL 中运行的东西。我宁愿不使用 SSIS,因为这样做会将部分流程与简单的 SQL 分开,并且需要多个平台来运行它。
我管理着一些包含超过 10 亿条记录的表。他们的 ETL 每天运行,从平面文件中读取数据并在每个文件中插入几千条记录。
现在我需要将这些相同的表也保存在另一个数据库中,当然它们需要具有相同的数据。数据将使用链接服务器传输。
最简单的方法是截断目标表,选择源插入到目标,然后重建其索引。但我不喜欢每天复制相同数据的想法。
我看到的另一个解决方案是查询源表和目标表,按日期维度区分,然后仅复制缺失日期的记录。然后我会创建一个监视器来查看每天的记录数量是否相等并突出显示不匹配的日期。
第二种解决方案是否足够好,或者是否有针对这种情况的最佳实践?
我们有一个带有 SQL Server 2012 实例的 Windows Server 2012。
它的服务曾经在 Windows 2000 Server 的旧域的 Active Directory 帐户下运行。几年前,我们将 AD 替换为 Windows Server 2012 并创建了一个新域。
现在我们决定将服务帐户替换为新域。完成该更改后,Windows 身份验证无法正常工作。SQL Server 显示消息“无法生成 SSPI 上下文”。
如果我使用 MSTSC 登录服务器,则 Windows 身份验证有效。但是,如果我尝试从本地 PC 登录,则会失败。
我已经阅读了一些支持https://support.microsoft.com/en-us/kb/811889,但它有点旧,我无法正确理解它。
知道是什么导致了这个错误,以及如何解决它?
我正在组织我们的 SQL Server 实例的权限。我想停止使用 SQL Server 帐户,而是向 Active Directory 组授予权限,然后将用户和服务帐户添加到这些组。我还试图从用户中删除 sysadmin 角色。
我已按照向 SQL Server 中的 Active Directory 帐户授予管理员和拒绝用户在 master 中创建表的权限的说明进行操作。
进行这些更改后,一切似乎都正常......直到我尝试手动开始工作。我收到了消息non-sysadmins have been denied permission to run dts execution job spets without a proxy account
。
如果我将 AD 组添加到 sysadmin,它就可以工作。如果我删除,它会失败。
在使用代理帐户从 SQL Server 代理运行 SSIS 包之后,我创建了一个代理。然后我开始收到消息Unable to start execution of step 1 reason jobowner doesn't have permission to use proxy 1 for subsystem
。
How to give SQL Server Job Owner permission to Proxy a Credential解释了如何将用户设置为代理的主体。它没有用。我尝试添加组和用户。但是当我单击确定并重新打开对话框时,我添加的对话框不再列出。
那么,基本上,如何授予非系统管理员用户执行作业的权限?最好将其授予 AD 组而不是特定用户。
我能够在 MSSQL 中向 Active Directory 组授予访问权限并将服务帐户添加到该组。它工作正常,我可以使用受信任的连接从 MSSQL 和 .Net exe 使用我的个人帐户和服务帐户登录该 MSSQL。
现在我需要使用这个 AD 服务帐户在另一个实例上配置一个链接服务器到这个实例。
要使用本地 MSSQL 帐户创建链接服务器,我只需打开新建链接服务器对话框,提供 MSSQL 主机,将服务器类型设置为 MSSQL,在安全设置Be made using this security context
中,提供用户名和密码,并在服务器选项中将 RPC 和 RPC Out 设置为 true。
但是当我尝试使用 AD 帐户执行此操作时,我收到一条错误消息,提示登录失败。
知道如何使用 AD 帐户配置链接服务器吗?
我注意到我可以在主数据库中创建表、模式、存储过程等。
我不知道是什么授予了这个权限。这很烦人,因为当我们在 SSMS 中打开 *.sql 文件时,它默认与master相关。如果在CREATE
没有注意到并设置正确的数据库上下文的情况下执行操作,则在master中创建表。
如果我们没有权限,我们会得到一个错误,注意到它并更改数据库上下文。有了权限,表就被创建了,我们稍后才看到错误,需要删除它并重新创建。我注意到master中已经有一些错误创建的表。
我想撤销每个人类用户的许可,但我害怕破坏某些东西。我不知道某些 SQL Server 例程是否需要在那里创建的权限。
在不破坏 SQL Server的情况下撤销master的创建权限的最佳方法是什么?
我有一个 SQL Server 2012 实例和一个 Active Directory 组,我可以将 Active Directory 用户添加到其中。我在该组中有我的个人 AD 帐户 (MyAccount) 和服务帐户 (ServiceAccount)。
我需要为整个实例授予对此 AD 组的管理员访问权限。这意味着我不需要对创建的每个新表和数据库执行授权命令。该组中的任何用户都将自动能够创建、删除、插入、选择等。
甚至更棘手。我必须能够使用 Windows 身份验证通过 MyAccount 登录(我在 Windows 上登录,然后登录到 SQL Server 而无需再次输入用户名密码),并通过输入用户名和密码使用 ServiceAccount 登录。我不能被迫使用 ServiceAccount 登录 Windows(或使用该帐户运行 SSMS/SSDT/等)才能登录 MSSQL。
配置它的最佳实践是什么?
考虑 5 个表,每个表有超过 10 亿条记录。
查询需要加入它们。而且我知道他们只需要不到 10% 的记录。假设他们都有一个日期维度,并且只需要当前月份的数据。
什么应该更快:
1)使用简单的SELECT:连接所有表,然后过滤(WHERE)每个表的当前月份维度。
2)创建5个临时表,过滤每个源表的当前月份记录,这里我们也可以借此机会只选择需要的列,然后加入这些临时表。
额外的可能性:
3)维护二级表,只有当前月/年的数据。这些表由提供主要表的相同 ETL 维护。
我有一组仅在特定时间更新的维度。
我已将这些表移动到名为Dimensions
. 我想将此文件组保持为只读。当 ETL 运行时,它将文件组设置为读写,运行,然后将其设置回只读。
但是当我运行时ALTER DATABASE MYDB MODIFY FILEGROUP Dimensions READ_ONLY
,我收到消息Database state cannot be changed while other users are using the database 'MYDB'
。
避免新事务、等待当前事务完成然后运行此命令的侵入性最小的方法是什么?有没有办法让数据库成为单用户一段时间,或者让它离线,无论如何?
更新:我基于文章The Read Uncommitted Isolation Level:
对于需要最高级别一致性保证的场景,可序列化仍然是唯一安全的选择。对于只读数据的性能关键型操作(例如,在 ETL 窗口之间实际上是只读的大型数据库),显式地将数据库设置为 READ_ONLY 也是一个不错的选择(当数据库被访问时不使用共享锁)只读,并且没有不一致的风险)。
假设一个表存储有关某个事件的粒度数据。它包含事件的日期、大约 30K 类型的类型维度和大约 100 个类别的类别维度,以及一些数字事实。
平均每天有 1500 万笔交易。每年超过 50 亿,每十年超过 60G。这不是大数据,但它很多。
SQL Server 2012 表可以容纳多少行?
当然,较旧的数据使用频率较低,并且可以在同一 DB 上的多个表中进行分区。但是这种分区应该什么时候开始发生呢?一年1桌?5年?
从评论中收集的其他信息:
考虑一下:我有足够的存储空间来保存该事件的 300 亿条记录。如果每个事件记录需要 1KB,我在那个表中有 30TB,并且有足够的存储空间(以及它的日志)。它的PK是bigint。
您如何看待一张包含历史数据的表格和另一张包含最新数据的表格?该表没有事务事件,而是有一个目录,例如客户端。每天将 OLTP 的目录复制到 DW 中。所以我有一个保存历史数据的表和另一个包含最新记录的表。
在我使用的设计中,ETL 提供历史表,然后我使用 row_number() 通过其 NK 获取每个实体的最新记录。运行起来非常昂贵,但这样我就可以保留过去存在的实体,并且不再在 OLTP 上。
我在另一个数据库中已经存在的数据库中创建了一个表。它最初是用旧的数据库数据填充的。表的 PK 必须接收那些记录上已经存在的值,所以它不能是自动增量的。
现在我需要新表将其 PK 作为自动增量。但是在 PK 已经存在并且有数据之后,我该怎么做呢?