场景:我已将数据库的 dbdatareader 访问权限授予开发团队。他们确实每天都会刷新数据库。因此,由于此数据库刷新作业,登录的权限(即 SQL 登录)每天都会被撤销。
由于开发团队无法在数据库刷新后自动添加块添加权限,我作为系统管理员应该如何处理这种情况。我每天都会收到票,以授予对该数据库的只读访问权限。由于安全问题,我无法授予他们 dbaccessadmin。
请指教。
场景:我已将数据库的 dbdatareader 访问权限授予开发团队。他们确实每天都会刷新数据库。因此,由于此数据库刷新作业,登录的权限(即 SQL 登录)每天都会被撤销。
由于开发团队无法在数据库刷新后自动添加块添加权限,我作为系统管理员应该如何处理这种情况。我每天都会收到票,以授予对该数据库的只读访问权限。由于安全问题,我无法授予他们 dbaccessadmin。
请指教。
谁能帮我理解以下情况:
请就以下情况提出建议:
SQL Server 在 2014 SP2 GDR 版本上
我阅读了 Compression 和 TDE 并没有齐头并进。
我有 2 个 PRD 环境:
服务器 1 和服务器 2 之间的表结构相同。
目前,上述数据库都启用了 TDE。
当我在下面备份时,它们不在 TDE 上时的详细信息:
服务器 1 中的数据库大小约为 400 GB,大约需要 51 分钟
服务器 2 中的数据库大小约为 687 GB,大约需要 108 分钟
当我在下面备份时,它们是 WITH TDE 时的详细信息:
服务器 1 中的数据库大小约为 400 GB,大约需要 57 分钟
服务器 2 中的数据库大小约为 687 GB,大约需要 207 分钟
我的观察
在与 Server 2 具有相同规格的 Server 1 中,所用时间为 51 Minutes (Pre TDE) --> 57 Minutes after TDE Enabled
在与服务器 1 具有相同规格的服务器 2 中,所用时间为 108 分钟(TDE 前)--> 启用 TDE 后 207 分钟
我的问题 为什么与服务器 2 所用时间相比,这种差异几乎翻了一番,但服务器 1 只有 7 分钟。
注意:另外,我的数据库在备份时使用 TDE + EFS(加密文件系统)。
请告知,因为压缩和 TDE 不能齐头并进。在服务器 2 中花费的时间是 DOUBLE 的原因是什么,而在服务器 1 中,启用 TDE 后仅 7 分钟。
问候
以下是我的 SQL Server 详细信息:
注意:数据库启用了 FileStream。
以下是我最近做的一系列动作,需要大家帮助理解和改正:
我的实际问题是:
当前数据库的 Is_encrypted 值在恢复为“3”之前现在是“1”。
当我恢复加密备份时,我如何确保(或)完全可以看到数据库也已加密?我的想法错了吗,请分享一些关于这一点的见解?
这是我们第一次在关键的生产数据库上应用 TDE,我有以下问题。
在进行 TDE 时:
相关平台是带有可用性组的 SQL Server 2014 SP2 GDR。
我可以在下面得到一些意见吗:
SQL Server 版本:2014 SP2 GDR,带有 AOAG 环境。
是否可以在 SQL Server 中单独备份结构化数据和非结构化数据 (FileStream)?
对于结构化数据备份,我正在阅读有关排除 FILESTREAM 文件组的部分备份。
如果可以在 SQL Server 中单独备份结构化数据和非结构化数据(FileStream),我可以分别恢复结构化数据和非结构化数据(FileStream)吗?如何单独恢复 FileStream 数据?还是单独的结构化数据?
任何人都可以在以下情况下帮助我我需要按州 ID 分组的小帮助
下面是我的查询,我试图将所有输出放在一行中。
但我每年都会收到不同的线路。请帮助我在单行中获取所有输出,因为州 ID 相同。
SELECT StateID,
SUM(CASE WHEN [Year] = 2016 THEN FileSize END) AS FileSize_2016,
(Select count(Fileid) where year = '2016' ) AS TotalFs2016,
SUM(CASE WHEN [Year] = 2017 THEN FileSize END) AS FileSize_2017,
(Select count(Fileid) where year = '2017' ) AS TotalFs2017,
SUM(CASE WHEN [Year] = 2018 THEN FileSize END) AS FileSize_2018,
(Select count(Fileid) where year = '2018' ) AS TotalFs2018,
SUM(CASE WHEN [Year] = 2019 THEN FileSize END) AS FileSize_2019,
(Select count(Fileid) where year = '2019' ) AS TotalFs2019
--FileState
FROM
(
SELECT StateID,[Year],FileID,FileTotalSizeMBs AS FileSize --, FileState
FROM #Temp1
UNION ALL
SELECT StateID,[Year],FileID,FileTotalSizeMBs --, FileState
FROM #Temp2
UNION ALL
SELECT StateID,[Year],FileID,FileTotalSizeMBs --, FileState
FROM #Temp3
UNION ALL
SELECT StateID,[Year],FileID,FileTotalSizeMBs --, FileState
FROM #Temp4
)t
where StateID like '570'
GROUP BY
t.StateID , year
当前输出为不同年份提供 4 行,例如 2016 年、2017 年、2018 年、2019 年以及文件的大小。
由于 ID 相同,我只想在哪里获得所有年份数据的一行。
我试图 GROUP BY 但仍然无济于事。
感谢您的帮助。
任何人都可以在下面帮助我获得合并的 ServiceID 以及一年内与之关联的文件大小的总和。
完整代码(供参考)
If(OBJECT_ID('tempdb..#temp1') Is Not Null)
Begin
Drop Table #Temp1
End
GO
If(OBJECT_ID('tempdb..#temp2') Is Not Null)
Begin
Drop Table #Temp2
End
GO
If(OBJECT_ID('tempdb..#temp3') Is Not Null)
Begin
Drop Table #Temp3
End
GO
If(OBJECT_ID('tempdb..#temp4') Is Not Null)
Begin
Drop Table #Temp4
End
GO
SELECT *
INTO #Temp1
FROM
(
SELECT
SUBSTRING(ServiceName,2,3) AS ServiceID
, FileTotalSize as FileSize
,year = '1980' from table1
) a
--1981
SELECT *
INTO #Temp2
FROM
(
SELECT
SUBSTRING(ServiceName,2,3) AS ServiceID
, FileTotalSize as FileSize
,year = '1981'
from table2
) b
--1982
SELECT *
INTO #Temp3
FROM
(
SELECT
SUBSTRING(ServiceName,2,3) AS ServiceID
, FileTotalSize as FileSize
,year = '1982' from table3
) c
--1983
SELECT *
INTO #Temp4
FROM
(
SELECT
SUBSTRING(ServiceName,2,3) AS ServiceID
, FileTotalSize as FileSize
,year = '1983' from table4
) d
select ROW_NUMBER() OVER(ORDER BY year ASC) AS ID,ServiceID,year,FileTotalSize AS FileSize1 from #Temp1
select ROW_NUMBER() OVER(ORDER BY year ASC) AS ID,ServiceID,year,FileTotalSize AS FileSize2 from #Temp2
select ROW_NUMBER() OVER(ORDER BY year ASC) AS ID,ServiceID,year,FileTotalSize AS FileSize3 from #Temp3
select ROW_NUMBER() OVER(ORDER BY year ASC) AS ID,ServiceID,year,FileTotalSize AS FileSize4 from #Temp4
以下是我最终使用的 #temp 表中存在的 4 个查询及其输出:
select ROW_NUMBER() OVER(ORDER BY year ASC) AS ID,ServiceID,year,FileTotalSize AS FileSize1 from #Temp1
select ROW_NUMBER() OVER(ORDER BY year ASC) AS ID,ServiceID,year,FileTotalSize AS FileSize2 from #Temp2
select ROW_NUMBER() OVER(ORDER BY year ASC) AS ID,ServiceID,year,FileTotalSize AS FileSize3 from #Temp3
select ROW_NUMBER() OVER(ORDER BY year ASC) AS ID,ServiceID,year,FileTotalSize AS FileSize4 from #Temp4
上述 4 个查询的输出:
我的问题:如何使用上述 4 个查询获得以下输出?请帮助我,我需要加入的方式。我尝试了加入他们的方式,但确定这是错误的,所以寻求帮助。
谢谢
SQL Server 表上的索引是否会比表本身消耗更多的磁盘空间?
我已经阅读了几篇文章并研究了这个和一些专家推荐的表分区,例如,这个 MSDN 论坛问题
为什么和索引可以比实际数据更大?
如何减小索引大小?
在这种情况下如何识别不必要的索引?
我的数据库初始大小为 370GB。
当我检查时EXEC sp_spaceused
,我可以看到将近 360GB 的未分配空间。
未分配的空间是否意味着未使用的空间?如果是未使用的空间,为什么会导致存储问题?
除了使用 360GB 未分配空间缩小 .mdf 文件外,我还有哪些选择?
此外,由于这是一个巨大的数据库,我可以在下面的“x”处提到什么级别的增量 - 我每次缩小时可以从 10,000 MB 开始吗?
USE Demo
GO
DBCC SHRINKFILE (N ‘Demo’, x)
GO
在这种情况下还有什么我应该考虑的吗?
添加新的数据文件会有帮助吗?
我有一个 10 GB 大小的 SQL Server 数据库。当我执行备份时,大约需要 3-4 分钟。当我尝试恢复时,几乎相同的 3-4 分钟。
这是否意味着 SQL Server 数据库的备份和恢复时间总是相等的,还是可以不同?
请建议并指出我背后的逻辑。
请在下面帮助我。
我正在尝试使用 sql 查询将值插入到临时表中。但我面临以下错误。
请帮助我理解错误。
我面临的错误:
忽略数据库名称“tempdb”,引用 tempdb 中的对象。
忽略数据库名称“tempdb”,引用 tempdb 中的对象。忽略数据库名称“tempdb”,引用 tempdb 中的对象。
消息 156,级别 15,状态 1,第 17 行关键字“使用”附近的语法不正确。
消息 3701,级别 11,状态 5,第 91 行无法删除表“#BackupStatus”,因为它不存在或您没有权限。
到目前为止我尝试过的查询:
IF OBJECT_ID('tempdb..#BackupStatus') IS NOT NULL
DROP Table tempdb..#BackupStatus
create table tempdb..#BackupStatus(
Server_name VARCHAR(50),
Full_Backup_Status_Weekly VARCHAR(50),
Diff_Backup_Status_Daily VARCHAR(50),
Transaction_log_backup_Hourly VARCHAR(50))
--select * from #BackupStatus
insert into tempdb..#BackupStatus
(Server_name , Full_Backup_Status_Weekly,Diff_Backup_Status_Daily,Transaction_log_backup_Hourly)
--select Server_name , Full_Backup_Status_Weekly,Diff_Backup_Status_Daily,Transaction_log_backup_Hourly from
values
use msdb
go
WITH [MostRecentBackupStatus_CTE]
AS
(
SELECT bsfull.[server_name] ,
bsfull.[database_name] ,
bsfull.[backup_finish_date] AS [last_full_backup] ,
bsdiff.[backup_finish_date] AS [last_diff_backup] ,
bstlog.[backup_finish_date] AS [last_tran_backup] ,
DATEDIFF(dd, bsfull.[backup_finish_date], CURRENT_TIMESTAMP) AS [days_since_full_backup] ,
DATEDIFF(dd, bsdiff.[backup_finish_date], CURRENT_TIMESTAMP) AS [days_since_diff_backup] ,
DATEDIFF(hh, bstlog.[backup_finish_date], CURRENT_TIMESTAMP) AS [hours_since_tranlog_backup]
FROM [msdb]..[backupset] AS bsfull
LEFT JOIN [msdb]..[backupset] AS bstlog ON bstlog.[database_name] = bsfull.[database_name]
AND bstlog.[server_name] = bsfull.[server_name]
AND bstlog.[type] = 'L'
AND bstlog.[backup_finish_date] = ( (SELECT MAX([backup_finish_date])
FROM [msdb]..[backupset] b2
WHERE b2.[database_name] = bsfull.[database_name]
AND b2.[server_name] = bsfull.[server_name]
AND b2.[type] = 'L') )
LEFT JOIN [msdb]..[backupset] AS bsdiff ON bsdiff.[database_name] = bsfull.[database_name]
AND bsdiff.[server_name] = bsfull.[server_name]
AND bsdiff.[type] = 'I'
AND bsdiff.[backup_finish_date] = ( (SELECT MAX([backup_finish_date])
FROM [msdb]..[backupset] b2
WHERE b2.[database_name] = bsfull.[database_name]
AND b2.[server_name] = bsfull.[server_name]
AND b2.[type] = N'I') )
WHERE bsfull.[type] = N'D'
AND bsfull.[backup_finish_date] = ( (SELECT MAX([backup_finish_date])
FROM [msdb]..[backupset] b2
WHERE b2.[database_name] = bsfull.[database_name]
AND b2.[server_name] = bsfull.[server_name]
AND b2.[type] = N'D') )
AND EXISTS ( SELECT [name]
FROM [master].[sys].[databases]
WHERE [name] = bsfull.[database_name] )
AND bsfull.[database_name] NOT IN (N'tempdb' , N'Master' ,N'Model' , N'MSDB')
)
SELECT c.[server_name] ,
-- c.[database_name] ,
-- d.[recovery_model_desc] ,
--c.[last_full_backup] ,
--c.[last_diff_backup] ,
--c.[last_tran_backup] ,
CASE
WHEN c.[days_since_full_backup] <= 7 THEN 'Success'
WHEN c.[days_since_full_backup] >= 7 THEN 'Failed'
ELSE NULL END AS Full_Backup_Status_Weekly,
CASE
WHEN c.[days_since_diff_backup] <= 1 THEN 'Success'
WHEN c.[days_since_diff_backup] >= 1 THEN 'Failed'
ELSE NULL END AS Diff_Backup_Status_Daily,
CASE
WHEN c.[hours_since_tranlog_backup] <= 1 THEN 'Success'
WHEN c.[hours_since_tranlog_backup] >= 1 THEN 'Failed'
ELSE NULL END AS Transaction_log_backup_Hourly
--c.[days_since_full_backup] ,
-- c.[days_since_diff_backup] ,
-- c.[hours_since_tranlog_backup]
--c.[full_backup_location] ,
--c.[diff_backup_location] ,
--c.[tlog_backup_location]
FROM [MostRecentBackupStatus_CTE] c
INNER JOIN [master].[sys].[databases] d ON c.[database_name] = d.[name];
DROP Table tempdb..#BackupStatus
记住最近的漏洞攻击补丁,如 Spectre 和 Meltdown ,我想修补我的 SQL Server 2014 SP2 (12.0.5000)
1.SQL Server 2014 SP2 CU10 安全更新说明:2018 年 1 月 16 日-SP2 CU10 KB4057117 12.0.5571.0
2.SQL Server 2014 SP2 GDR 安全更新说明:2018 年 1 月 16 日-SP2 GDR KB4057120 12.0.5214.6
任何人都可以帮助我解决以下问题:
任何人都可以在下面帮助我。我正在尝试使用 DAC(-A 开关)执行 SQLCMD 但无法执行。
我怎样才能通过以下两种方式做到这一点:
以下是我没有运气的尝试。
EXEC master.dbo.xp_cmdshell "SQLCMD -S SQLServer -d Db1 -A
go
select count(*) AS FileCount from TableName
go"
'select' 不是内部或外部命令,也不是可运行的程序或批处理文件。无效的
消息 103,级别 15,状态 4,第 1 行以 ' 开头的标识符
SQLCMD -S SQLServer -d Db1 -A
go
select count(*) AS FileCount' is too long. Maximum length is 128.
请在下面的查询中帮助我。
注意: 请原谅我的编程技巧,代码有错误。
我希望在一个列中输出数据库名称,在另一列中启用或禁用 FileStream。我正在尝试的只有 2 列。谢谢
查找数据库名称以及是否为数据库启用了 FileStream。
declare @cmd varchar(500)
set @cmd='USE ?
if exists(
select name, Filestream from sys.database_files where type_desc='FILESTREAM')
CASE type_desc WHEN 'FILESTREAM' THEN 'Filestream Configured For Datbase' ELSE 'Filestream NOT Configured For Datbase'
PRINT 'Filestream Configured For Datbase'
else
print 'Filestream Not configured for database'
inner join sys.databases where name not in (''master'', ''tempdb'', ''model'', ''msdb'')')
exec sp_MSforeachdb @cmd
下面的两个 T-SQL 命令有区别吗?
带引号的列名
SELECT SUM(DATALENGTH('ColumnName')) / 1048576.0 AS ColumnName
FROM DatabaseName.Schema.Tablename
不带引号的列名
SELECT SUM(DATALENGTH(ColumnName)) / 1048576.0 AS ColumnName
FROM DatabaseName.schema.Tablename
请给我以下建议:
我正在计算具有以下数据类型(包括视图和用户架构表)的 LOB 对象的总大小。
select * from information_schema.columns where data_type in
('TEXT', 'NTEXT','IMAGE' ,'XML', 'VARBINARY')
or
(data_type = 'VARCHAR' and character_maximum_length = -1)
OR
(data_type = 'NVARCHAR' and character_maximum_length = -1)
一旦我得到以下查询的输出,我就使用 DATALENGTH 函数来获取每一列的大小。
SELECT SUM(DATALENGTH('ColumnName')) / 1048576.0 AS ColumnName FROM DatabaseName.schema.Tablename
注意: 输出将是兆字节,因为我正在使用/ 1048576.0
综上所述,我用于存储文件流数据的总驱动器大小为1 TB 。但是用 DATALENGTH 函数计算每个 LOB 列的长度后,它与 Drive 上当前使用的空间不匹配。
例如 :
当前驱动器大小为 1 TB,其中 951 GB 是可用空间 0.99 TB。这意味着 File Stream 数据类型列使用 50 GB。但是当我检查 T-SQL 上面的所有列时,我无法获得与已用空间 (50 GB) 匹配的确切大小。甚至不接近尺寸。它们的使用率非常低。
除了上述数据类型之外,还有什么可以使用该驱动器?
如何使用 DATALENGTH 函数计算列的大小,该函数将与文件流驱动器中的已用空间相匹配..
最近我们开始收到如下警报:
以下是我到目前为止使用上述日志 (xx.xx.xx.xxx) 中的客户端 IP 查找主机名的步骤:
nststat -a xx.xx.xx.xxx
这没有给我任何关于客户端主机名的信息,并说 HostName not found 。
ping -a xx.xx.xx.xxx
这给了我提到的 IP 的回复消息。
nslookup xx.xx.xx.xxx
域找不到IP。
我还应该做些什么来找出登录失败的问题以及它是谁的登录以及从哪台机器登录?
任何人都可以在下面帮助我:
我想将 SQL Service\SQL Agent Service 更改为 Active Directory Accounts。但在此之前,我想了解以下内容:
可以使用SQL服务默认提供的默认账号吗
如果我不能,为什么我不能使用它们?
如果可以,为什么我需要 Windows 域级服务帐户?
为什么需要将 SQL Server 代理帐户添加为 SysAdmin,它是 SQL Server 代理帐户的默认性质吗?
任何人都可以帮助我简要介绍上述几点的背景。
我想监控事务日志的使用情况,包括以下所有方面:
什么 Task\Job\Query 使它填充驱动器\文件。
日志文件使用百分比。
交易发生的时间。
任何经过测试的相关方法都会有所帮助。