小编Lum*_*mpy的帖子

涉及 Sys 表的安全问题

我们有一个应用程序用户,该用户已获得对相应数据库的读写权限。默认情况下,该用户可以查询 sys 表。我还听说,有时此用户需要能够获取数据库中存在的表和列的列表。让用户对 sys 表具有读访问权限是否存在任何安全风险?

security sql-server-2008-r2

4
推荐指数
1
解决办法
332
查看次数

日志文件增长问题

我们每晚都将来自一堆数据库的数据整合到四个报告数据库中。

因为每晚都会导入整个数据集,所以我们不需要能够将数据恢复到某个时间点。因此数据库处于简单恢复模式。

然而,每次我们运行导入时,我们的数据库ldf文件都会变得非常大(50+ Gig)。

有没有办法完全关闭日志记录或让 SQL Server 更快地清除这些日志文件?

我猜没有进行结算的log_reuse_wait_descACTIVE_TRANSACTION

sql-server-2008 transaction-log

4
推荐指数
1
解决办法
136
查看次数

数据变更审计计划

我的公司正在从分布式 Access 数据库模型转变为使用集中式 SQL 数据库。数据表的设计使得所有表都具有修改日期。在讨论中,有人建议,由于我们将在每个表上创建一个触发器来处理修改日期,也许我们应该让触发器也将一些信息记录到审计表中。

这是设置审计的最佳方法,以便我们可以跟踪谁在更改信息,还是有更好的方法?欢迎提供有关该主题的文章的链接。

对于审计,我正在考虑捕获表名、列名、修改日期、行 ID 和进行更改的人的用户名。是否有任何我没有想到应该捕捉的信息可以帮助我避免未来的跌倒?

sql-server audit

3
推荐指数
1
解决办法
895
查看次数

用户可以在未经许可的情况下更改程序

我有一个 sql server 用户,我们的应用程序正在以该用户身份连接。用户已被授予 db_datareader 和 db_datawriter 以及对其需要使用的每个存储过程的 Grant Execute。

这些是我在登录时查看用户映射以及在数据库下查看用户时看到的权限。

鉴于这些权限,我认为用户不应该能够更改程序;但是,当我的开发人员以该用户身份登录时,他们能够更新存储过程。

我对这些权限允许的内容有误解吗?有什么地方可以查找有关可能未显示在 UI 中的权限的信息吗?或者我是否需要明确拒绝更改该用户的存储过程?

permissions sql-server-2008-r2

3
推荐指数
1
解决办法
1787
查看次数

获取快照数据文件列表

我需要以编程方式删除一个包含所有快照的数据库,然后重新创建该数据库并创建一个新快照。我无法从查询中找到快照文件所在的位置。

本质上,我们有几个环境,它们在放置这些文件的位置上不一致,所以我需要我的代码足够聪明,以便将这些文件放回原来的位置。

澄清一下:当我说快照文件时,我指的是 .ss 文件。

sql-server t-sql snapshot sql-server-2012

3
推荐指数
1
解决办法
252
查看次数

只应为任何逻辑文件名指定一个 WITH MOVE 子句

我正在尝试通过编写备份和还原脚本来复制数据库。我的备份程序工作正常,但我不断收到错误消息

已为文件指定了冲突的文件重定位。只应为任何逻辑文件名指定一个 WITH MOVE 子句。

当我运行该程序进行还原时。

这是程序代码。谁能发现我的错误是什么?

ALTER PROCEDURE spDBRestore (@BackupName NVARCHAR(50), @RestoreName NVARCHAR(50))
AS 
BEGIN
DECLARE @BackupPath NVARCHAR(4000) = 'S:\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\TemplateCopy\'+@BackupName+'.BAK',
@NewDBFileName NVARCHAR(4000) = 'S:\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\'+@RestoreName+'.mdf',
@NewLFFileName NVARCHAR(4000) = 'L:\MSSQL10_50.MSSQLSERVER\MSSQL\Data\'+@RestoreName+'_1.ldf'
select @BackupName, @RestoreName, @NewDBFileName, @newlffilename
RESTORE DATABASE @RestoreName
FROM DISK = @BackupPath
WITH FILE = 1,
MOVE @BackupName TO @NewDBFileName,
MOVE @BackupName TO @NewLFFileName,
NOUNLOAD,
REPLACE;

END
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server backup stored-procedures

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

关于备份解决方案的建议

我们的数据库服务器由另一家公司托管。它们提供每天发生一次的文件级备份。它们还允许日志传送。我的公司正在利用他们的 Logshipping 选项作为其备份和恢复解决方案的主要部分。

我想要一个更好的备份系统,让我们能够将数据恢复到故障点。通常,这将是数据库的完整备份模型和事务日志的备份以及完整和增量。但是,供应商告诉我,向我们提供事务日志备份会导致日志传送出现问题。

是否有备份策略可以让我恢复到故障点并使用日志传送?

sql-server backup sql-server-2008-r2 log-shipping

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

根据列中的值返回记录的百分比

我正在处理一个 sql 查询,它需要根据特定列的值获取记录的百分比。百分比由用户给出。查询的精简版本如下

SELECT OrganizationID,
       CustomerID,
       OrderID
  FROM x
Run Code Online (Sandbox Code Playgroud)

输出看起来像

 OrganizationID, CustomerID, OrderID 
  123             abc         p456
  123             cba         p457 
  123             bac         p458 
  456             def         p987 
  456             efd         p988
Run Code Online (Sandbox Code Playgroud)

我需要能够为每个组织 ID 提取 50% 的输出。所以在这个例子中,我会返回 2-3 条记录。只要提取正确百分比的记录,哪些记录并不重要。

关于如何解决这个问题的任何想法?

sql-server-2008 t-sql

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

主键会被添加为聚集索引吗?

我继承了一个数据库,其中没有在表上定义主键。也没有分配给表的聚集索引。

如果我执行一个更改表来分配主键,这会导致 SQL Server 也创建聚集索引吗?如果是这样,由于数据在硬盘上重新定位,我应该期望数据库速度变慢吗?

index sql-server-2008 database-design sql-server

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

聚集索引与非聚集索引

我的数据库目前在ID每个表的列上都有一个主键/聚集索引。但是,连接到数据库的应用程序始终查看定义为:

SELECT * FROM Table WHERE DeletedDate IS NULL
Run Code Online (Sandbox Code Playgroud)

最好将 the 添加DeletedDate到聚簇索引中,还是将非聚簇索引DeletedDate作为包含的更好的做法?

index sql-server clustered-index sql-server-2008-r2 nonclustered-index

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

查看列有 8000 个字符的限制?

在 SQL Server 2008 R2 中,我们使用可更新视图来更新varchar(max)列。当我们用文本更新列然后检查字符数时,它显示的长度为 8000 个字符,即使更新包含更多的字符。

视图可以接收更新的字符数是否有某种限制?

好的,我正在与应用程序开发团队合作解决这个问题,他们认为他们找到了解决方法,因此他们放弃了用作测试用例的代码。我会尽力给出大致的想法。更新语句类似于:

UPDATE vorders
set [description] = '<br> This is some text about the order </br>' 
    + CHAR(34) + 'This is more text' + CHAR(34) + 'and on it goes'
where orderid = 12345
Run Code Online (Sandbox Code Playgroud)

然后我们将通过运行以下查询来检查放入该字段的字符的长度

SELECT LEN([description])
  FROM vorders
 WHERE orderid = 12345
Run Code Online (Sandbox Code Playgroud)

应用程序人员发现,如果他们删除 + CHAR(34) + 部分代码,则长度将达到 8700 个字符。使用 + CHAR(34) + 部分代码将文本截断为 8000 个字符。这让我怀疑这是某种隐式转换;但是,我们发现在 + CHAR(34) + 中的一两个就位时不会发生截断。最初的声明大约有 30 个。

知道是什么原因导致了这个问题,我对此一无所知。

sql-server sql-server-2008-r2 view

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

返回完整记录集的百分比

我正在拉回订单列表,但我只需要显示一定比例的记录。例如,我们想要前 30 名或前 50 名。百分比是可变的,所以我不想使用 TOP。我尝试了下面的代码,但没有返回任何记录。

SELECT x.SelectionCriteriaID, 
       x.DeliveryCriteriaID, 
       x.SurveyID, 
       x.intappid, 
       x.intcustomerID, 
       x.intorderid, 
       x.RowNumber RowNumber,
       x.cntoid
  FROM (SELECT @SelectionCriteriaID SelectionCriteriaID, 
               @DeliveryCriteriaID DeliveryCriteriaID, 
               @SurveyID SurveyID, 
               ord.intappid, 
               ord.intcustomerID, 
               ord.intorderid, 
               ord.cntoid,
               ROW_NUMBER() OVER (ORDER BY ord.intcustomerid) AS RowNumber
          FROM ord
         WHERE ord.cntoid >= ISNULL(@MinNumberOrders, 1)
           AND ord.cntoid < ISNULL(@MaxNumberOrders, 999999999))x
 GROUP BY x.SelectionCriteriaID, x.DeliveryCriteriaID, x.SurveyID, x.intappid, x.intcustomerID, x.intorderid, x.RowNumber, x.cntoid
 HAVING x.rownumber < MAX(x.RowNumber)/(100/@percent)
Run Code Online (Sandbox Code Playgroud)

sql-server query t-sql sql-server-2008-r2

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