标签: sql-server-2012

限制对某些列的更新。只允许存储过程更新那些列

我有敏感的价格列,我只想通过存储过程进行更新。如果不使用旨在更新它的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都失败。

我正在考虑使用触发器和令牌表来实现这一点。我正在考虑的想法是有一个令牌表。存储过程必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查更新行的令牌表中是否存在该令牌。如果找到,它将继续。如果未找到令牌,则会抛出异常并使更新事务失败。

有没有好的/更好的方法来实现这个限制?

trigger sql-server stored-procedures t-sql sql-server-2012

18
推荐指数
2
解决办法
3万
查看次数

限制 SQL Server 上的连接权限

我有一个应用程序要部署在使用“荣誉系统”安全性的生产中。也就是说,所有用户都使用 SQL 用户/密码凭证连接到数据库,应用程序自行管理权限。后一部分并没有像连接对象包含嵌入式凭据并且可以自由复制这一事实那样困扰我。我试图找到某种方法来限制与一组更有限的客户端的连接。当然,我可以创建防火墙规则来限制 IP。有没有办法通过机器帐户或域成员资格“预审”SQL 登录?

security sql-server sql-server-2012

17
推荐指数
2
解决办法
8735
查看次数

使用 WITH REPLACE 还原备份时出现错误 3154

我的计算机上安装了 SQL 2012 SP1。我做了一个数据库的备份test.bak

我有一个test2同名的数据库,但数据发生了变化。

我想test.bak通过test2数据库恢复。

我总是收到错误:

错误 3154:备份集包含现有数据库以外的数据库的备份。

我试过:

  1. 我右键单击 test2 -> Restore database -> From device

    我选择test.bak并检查了With Replace但我收到错误。

  2. 然后我尝试右键单击 test2 -> Restore file and filegroups

    我选择test.bak并检查了With Replace但我收到错误。

我可以删除旧数据库,然后使用正确的名称恢复备份,但是当我使用 SQL 2008 时,恢复现有数据库没有问题。

好像是因为我用的是SQL2012,所以经常出现这个错误!

sql-server backup restore sql-server-2012

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

SQL Server 2012 将备份还原到新的数据库名称

我似乎记得,在 2008 年,您可以通过更改还原向导中“目标数据库”字段中的名称,将备份还原到数据库的新副本。它将创建一个全新的数据库,它是还原到您想要的时间点的原始数据库的副本。我一生都没有想出如何让 SQL 2012 做到这一点。

现在,我明白(感谢 Aaron Bertrand)这并没有真正改变,而且 2012 年实际上让我更明显地意识到,这个策略首先是一个坏主意!

所以,我需要做的是:通过使用现有数据库“MyDB”的备份文件,创建一个新数据库“MyDB_Copy”。我们有每晚完整备份 (.bak) 和每 15 分钟的 TLog (.trn)。我根本不希望现有的“MyDB”受到影响/触及,因为它是“活的”。

在从主完整备份文件创建 MyDB_Copy 之后,我需要恢复几十个 TLog 备份以使其及时到达某个时间点。

sql-server sql-server-2012

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

如何在 SQL Server 2012 中转移 dbo 架构的所有权

我不小心给了用户 db_owner 架构的所有权(使用 UI 中的复选框,如下所示),现在我不能:

  1. 将所有权转让给其他用户
  2. 从数据库中删除用户(尽管我可以删除 SQL Server 中的登录名)

我试过数据库主体在数据库中拥有一个架构,并且无法删除。

ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo
Run Code Online (Sandbox Code Playgroud)

虽然它成功完成,但用户仍然拥有所有权,并且它是灰色的,所以我似乎也无法在 UI 中执行此操作。

在此处输入图片说明

找到了解决办法:

除了Arron 的回答之外,我意识到我会在错误的数据库(facepalm!)中运行上述命令。一旦数据库得到纠正,上面的 SQL 和下面的答案都有效。

schema security sql-server-2012

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

如何在 SQL Server 2012 上创建只读服务器角色?

我在创建新服务器角色时授予“查看任何数据库”权限,但意识到此权限仅允许用户查看系统数据库。

我正在尝试创建一个只读且可以读取任何数据库的服务器角色。

有没有办法创建用户定义的服务器角色来读取用户数据库?或者我是否必须通过每个用户的用户映射来做到这一点?

permissions sql-server-2012

17
推荐指数
2
解决办法
3万
查看次数

使用 AlwaysOn 可用性组时收缩事务日志

我们正在使用AlwaysOn Availability GroupSQL Server 2012 的功能。每天都会在辅助数据库上进行定期的完整数据库备份和事务日志备份。

我在这里读到主副本或辅助副本上执行事务日志备份会将两个副本的事务日志标记为可重用。无论如何,事务日志备份大小很大,可以使用收缩文件来减少:

在此处输入图片说明

我已经在本地恢复了数据库并执行了收缩操作。日志文件大小减少到 160 MB。

我的问题是我应该在哪个数据库上对事务日志文件(主要、次要或两者)执行收缩操作?


我猜过去几年没有备份日志文件,所以它变得如此庞大。执行DBCC SQLPERF (LOGSPACE)我可以看到只0.06%使用了文件 - 我没有必要保留这么大的日志文件。在[sys].[database_files]我检查其max_size设置为-1growth65536,所以我想,当它需要更多的空间,它会得到。无论如何,我可以将其缩小到例如 5% 以防止未来的增长。我试图找到一些确认,我这样做不是坏主意。


实际上,备份(对数据库和日志文件)仅在辅助数据库上执行,因此对它们执行收缩文件会更容易,但是主日志文件的大小也会减小吗?

sql-server shrink sql-server-2012 transaction-log

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

如何将 SQL Server 死锁报告中的键转换为值?

我有一份死锁报告,告诉我有一个涉及到的冲突

waitresource="KEY: 9:72057632651542528 (543066506c7c)"
Run Code Online (Sandbox Code Playgroud)

我可以看到这个:

<keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528">
Run Code Online (Sandbox Code Playgroud)

该范围内<resource-list>的元素。

我希望能够找到键的实际值(例如,id = 12345)。我需要使用什么 SQL 语句来获取该信息?

sql-server deadlock primary-key sql-server-2012

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

列出作业、计划和下一次计划运行日期时间

列出作业、计划和下一次计划运行日期时间

我正在尝试列出作业、计划和下一个计划运行日期时间。但是,我似乎没有成功。

sysjobactivity 有 next_scheduled_run_date,这是我需要的,但我不知道将它连接到作业和计划。

如果有除 through 之外的方法sysjobactivity,请指导我。

SELECT
sj.name AS jobName
, ss.name AS scheduleName
, sja.next_scheduled_run_date
FROM msdb.dbo.sysjobs sj
INNER JOIN msdb.dbo.sysjobactivity sja ON sja.job_id = sj.job_id
INNER JOIN msdb.dbo.sysjobschedules sjs ON sjs.job_id = sja.job_id
INNER JOIN msdb.dbo.sysschedules ss ON ss.schedule_id = sjs.schedule_id
WHERE (sj.name LIKE 'xray%')
AND (sja.next_scheduled_run_date > GETDATE())
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012

17
推荐指数
2
解决办法
5万
查看次数

在 IF EXISTS 中包装查询使其非常慢

我有以下查询:

select databasename 
from somedb.dbo.bigtable l where databasename ='someval' and source  <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
Run Code Online (Sandbox Code Playgroud)

上述查询在三秒内完成。

如果上面的查询返回任何值,我们希望存储过程退出,因此我将其重写如下:

If Exists(
select databasename 
from somedb.dbo.bigtable l where databasename ='someval' and source  <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
)
Begin
Raiserror('Source missing',16,1)
Return
End
Run Code Online (Sandbox Code Playgroud)

但是,这需要 10 分钟。

我可以像下面这样重写上面的查询,它也可以在不到 3 秒的时间内完成:

  select databasename 
from somedb.dbo.bigtable l where databasename ='someval' and source  <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source
if @@rowcount >0 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 exists query-performance

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