Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

2
DDL_admin和db_owner权限
我正在接管一个涉及删除和限制服务器场中所有数据库用户权限的项目。(娱乐时间) 当前受限制的权限之一是db_owner权限。 该权限将根据具体情况进行审查,但是一个常见的更改是将db_owner权限替换为以下内容: db_datareader db_datawriter db_ddladmin db_executor 我想定义两者之间的确切区别(以告知客户)。 但是,据我所知,两者之间的区别应该是: db_accessadmin权限 db_backupoperator权限 db_securityadmin权限 所以实际上他们还是会输: [ALTER ANY USER] [CREATE SCHEMA] [BACKUP DATABASE],[BACKUP LOG],[CHECKPOINT] [ALTER ANY APPLICATION ROLE],[ALTER ANY ROLE] [DROP DATABASE] 将db_owner替换为上述四个角色后,用户还有其他事情会松动吗? 这实际上在很大程度上是出于安全目的吗?

4
如何查询SSISDB找出软件包中的错误?
我已经看到了这个问题 SSIS 2012-如何在T-SQL中查询当前正在运行的程序包? 它给了我以下脚本: SELECT E.execution_id , E.folder_name , E.project_name , E.package_name , E.reference_id , E.reference_type , E.environment_folder_name , E.environment_name , E.project_lsn , E.executed_as_sid , E.executed_as_name , E.use32bitruntime , E.operation_type , E.created_time , E.object_type , E.object_id , E.status , E.start_time , E.end_time , E.caller_sid , E.caller_name , E.process_id , E.stopped_by_sid …

5
要将10-20个SQL Server数据库备份和还原到〜同步状态?
我需要备份10-20个大小在10-50 GB之间的SQL Server 2008 R2数据库,而这些数据库是联机的并且由单个企业应用程序同时使用。我还需要将它们恢复到在所有数据库之间都基本同步的状态(我可以承受数据库之间长达几秒钟的取消同步)。目的是为QA / DEV环境捕获生产数据。 我强烈希望不要要求数据库以完全恢复的方式运行,并且要提出一种备份方法,该方法专用于为QA环境捕获数据,并且保持独立于不受我控制的主要备份过程。 对于我的客户,将需要1-2个小时来捕获20个完整备份,每个备份约30 GB。这使得按顺序进行完整备份是不可接受的,因为在简单恢复中运行时,数据库将太不同步。 我在寻找比这些更好的主意: 理念1:VM磁盘的SAN级别快照。从快照xcopy MDF / LDF。 将复制的文件附加到其他服务器实例后,其恢复过程将生成一致的数据库,这些数据库几乎同时是快照。 谷歌搜索使我确信这不是一个好主意,至少因为我可能会与master / msdb / etc失去同步。 理念2:在所有数据库之间进行复杂的备份和同步还原 这要求我要求数据库在完全恢复中运行,而这是我所不希望的。在截止日期(T0)之前,为所有数据库开始并行备份。达到T0后,备份所有日志(最多需要几分钟)。进行大量的备份,然后尝试还原它们并向前/向后滚动日志,以获得相对于T0的数据库之间的某种一致性状态。 这需要大量的计划和脚本来可靠地使用它,因此我会竭尽全力避免它。 我是否还缺少其他解决方案? PS1:我很想能够使用数据库快照。这个想法是在每个数据库上启动一个快照(应该以秒为单位),然后在接下来的几分钟/小时内依次完全备份每个数据库。然后将它们全部还原到另一台服务器上,并将它们还原为快照。AFAIK这种情况是不可能的,因为快照无法与数据库一起备份。它们只能在创建它们的服务器上回滚到位。此外,他们需要企业版,但我并没有为所有客户提供。 PS2:如果您知道能够产生跨数据库同步备份的第三方解决方案,请提出。

2
添加联接提示时,为什么SQL Server行估计会更改?
我有一个查询,该查询连接了几个表并且执行得很差-行估计相差1000倍,并且选择了嵌套循环连接,从而导致了多个表扫描。查询的形状非常简单,看起来像这样: SELECT t1.id FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id LEFT OUTER JOIN t3 ON t2.id = t3.t2_id LEFT OUTER JOIN t4 ON t3.t4_id = t4.id WHERE t4.id = some_GUID 在处理查询时,我注意到当我提示它对一个连接使用合并连接时,它的运行速度快了很多倍。我能理解-合并联接是联接数据的更好选择,但是SQL Server选择嵌套循环时并不能正确估计它。 我不完全理解的是,为什么此联接提示会更改所有计划运营商的所有估计?通过阅读不同的文章和书籍,我假设基数估计是在构建计划之前执行的,因此使用提示不会改变估计,而是明确地告诉SQL Server使用特定的物理联接实现。 但是,我看到的是,合并提示使所有估计变得非常完美。为什么会发生这种情况,并且有任何通用的技术可以使查询优化器在没有提示的情况下做出更好的估计-考虑到统计数据显然可以做到这一点? UPD:可在此处找到匿名的执行计划:https ://www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan?dl =0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl = 0 我使用TF 3604、9292和9204检查了两个查询使用的统计信息,它们是相同的。但是,查询之间扫描/查找的索引有所不同。 除此之外,我尝试使用来运行查询OPTION (FORCE ORDER)-它的运行速度比使用合并连接还要快,为每个连接选择HASH MATCH。

4
SQL Server最大内存,页面文件,最大并行度
希望您的DBA宇宙大师可以回答以下三个问题: 我知道设置SQL Server的最大内存是最佳实践。因此,如果具有44 GB RAM的服务器安装了SQL Server,则应将SQL Server最大内存设置为大约37GB。 但是,如果SQL Analysis Service和SQL Reporting Services与SQL Server安装在同一服务器上,我们应该设置什么?那么是否最好将SQL Server的最大内存设置为22GB RAM,以便Analysis可以占用其他22GB RAM? 在运行带有44 GB RAM的SQL Server的服务器上,设置页面文件大小的最佳实践是什么?我在Brent Ozar(http://www.brentozar.com/archive/2014/06/sql-server-setup-checklist-free-ebook-download/)上阅读了以下内容: SQL Server不需要巨型页面文件。如果要在服务器上安装其他应用程序(不建议这样做,则应隔离SQL Server)。您可能需要更大的页面文件。如果SQL Server是包装盒上运行的唯一主要服务,则通常在系统驱动器上创建2GB大小的页面文件。 微软表示,我们应该将页面文件系统设置为RAM的1.5倍,这与Remus的建议相符(请参见-> http://rusanu.com/2009/11/22/system-pagefile-size-on-machines-with -large-ram /)。 因此,在具有44GB RAM的服务器上,我们在SQL Analysis Service和SQL Reporting Services旁边安装了SQL Server。我们应将页面文件设置为什么大小? 对于SharePoint是SharePoint场的一部分的SQL Server以及SharePoint存储数据库的位置,应该将最大并行度设置为1。现在,我们拥有的服务器不属于SharePoint场的一部分(称为sql2)。服务器上安装了SQL Server,SQL Analysis and Reporting。SharePoint不会在其服务器上存储其数据库,但是我们确实创建了SharePoint读写的报告和分析数据库/多维数据集。 布伦特·奥扎尔(Brent Ozar)说: 经验法则:将此值设置为硬件上的单个NUMA节点(处理器)插槽中的物理内核数或更少 当该SQL Server实例具有4个VCPU时,应在该SQL Server实例上为最大并行度配置什么? 希望你们不仅给我,而且让更多的SQL管理员对最佳实践的了解比与Internet上的丛林有关。

1
用户共享的查询:动态SQL与SQLCMD
我必须重构和记录许多foo.sql查询,这些查询将由数据库技术支持团队共享(针对客户配置等)。每个客户都有自己的服务器和数据库的票证类型经常出现,但其他方面的架构是相同的。 当前无法选择存储过程。我正在讨论是使用动态还是使用SQLCMD,因为我在SQL Server上有些新手,所以我也没有使用太多。 我觉得SQLCMD脚本对我来说绝对看起来更“干净”,并且更易于阅读和根据需要对查询进行较小的更改,但同时也迫使用户启用SQLCMD模式。由于使用字符串操作编写查询会导致语法高亮丢失,因此动态处理更加困难。 这些正在使用Management Studio 2012(SQL版本2008R2)进行编辑和运行。每种方法的优缺点是什么,或者一种方法或另一种方法的某些SQL Server“最佳实践”是什么?其中一个比另一个更“安全”吗? 动态示例: declare @ServerName varchar(50) = 'REDACTED'; declare @DatabaseName varchar(50) = 'REDACTED'; declare @OrderIdsSeparatedByCommas varchar(max) = '597336, 595764, 594594'; declare @sql_OrderCheckQuery varchar(max) = (' use {@DatabaseName}; select -- stuff from {@ServerName}.{@DatabaseName}.[dbo].[client_orders] as "Order" inner join {@ServerName}.{@DatabaseName}.[dbo].[vendor_client_orders] as "VendOrder" on "Order".o_id = "VendOrder".vco_oid where …

2
为什么标量值函数需要执行权限而不是选择权限?
我想知道为什么对于标量值函数,我必须授予用户执行权而不仅仅是选择权? 同时,表值函数仅在具有选择权限或db_datareader成员资格的情况下才能正常工作。 为了更清楚,这里是我的示例:我需要一个对数据库具有只读权限的用户。所以我创建了一个名为的用户,testUser并为其指定了db_datareader成员资格。然后我创建了一个名为的表值函数fn_InlineTable。一切都很棒。testUser全天运行此SQL select * from dbo.fn_InlineTable 然后我需要一个标量函数,所以我创建了一个叫做的标量函数fn_ScalarTest。 testUser无法运行此SQL Select dbo.fn_ScalarTest(1) 可以理解的是:这是因为我没有授予“ testUser”执行权限fn_ScalarTest。 我的问题是:基于此链接/programming/6150888/insert-update-delete-with-function-in-sql-server,说FUNCTION不能使用a来执行修改数据库状态的操作。那么,为什么不让标量函数与相同的“ SELECT”权限一起使用,而不是执行权限呢? 我希望我的问题有道理。谢谢。

2
不可搜索的持久化计算列上的索引
我有Address一个名为的表,该表具有一个称为的持久计算列Hashkey。该列是确定性的,但不精确。它具有不可搜索的唯一索引。如果运行此查询,则返回主键: SELECT @ADDRESSID= ISNULL(AddressId,0) FROM dbo.[Address] WHERE HashKey = @HashKey 我得到这个计划: 如果我强制索引,我会得到更糟糕的计划: 如果我尝试同时使用索引和查找,则会收到错误消息: 由于此查询中定义的提示,查询处理器无法生成查询计划。重新提交查询而不指定任何提示,也无需使用SET FORCEPLAN 这仅仅是因为它不精确吗?我以为如果坚持下去没关系吗? 有没有一种方法可以使该索引可查询而不将其设为非计算列? 有人在此链接到任何信息吗? 我无法发布实际的表创建,但是这是一个具有相同问题的测试表: drop TABLE [dbo].[Test] CREATE TABLE [dbo].[Test] ( [test] [VARCHAR](100) NULL, [TestGeocode] [geography] NULL, [Hashkey] AS CAST( ( hashbytes ('SHA', ( RIGHT(REPLICATE(' ', (100)) + isnull([test], ''), ( 100 )) ) + …

4
如何将SQL Server死锁报告中的键转换为值?
我有一个死锁报告,告诉我发生了涉及waitresource =“ KEY:9:72057632651542528(543066506c7c)”的冲突,并且我可以看到: <keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528"> 在<resource-list>中。我希望能够找到密钥的实际值(例如,id = 12345)。我需要使用什么SQL语句来获取该信息?

1
sp_cursoropen和并行性
我遇到了一个查询似乎无法解决的性能问题。 我从游标定义中拉出了查询。 该查询需要几秒钟才能执行 SELECT A.JOBTYPE FROM PRODROUTEJOB A WHERE ((A.DATAAREAID=N'IW') AND ((A.CALCTIMEHOURS<>0) AND (A.JOBTYPE<>3))) AND EXISTS (SELECT 'X' FROM PRODROUTE B WHERE ((B.DATAAREAID=N'IW') AND (((((B.PRODID=A.PRODID) AND ((B.PROPERTYID=N'PR1526157') OR (B.PRODID=N'PR1526157'))) AND (B.OPRNUM=A.OPRNUM)) AND (B.OPRPRIORITY=A.OPRPRIORITY)) AND (B.OPRID=N'GRIJZEN'))) AND NOT EXISTS (SELECT 'X' FROM ADUSHOPFLOORROUTE C WHERE ((C.DATAAREAID=N'IW') AND ((((((C.WRKCTRID=A.WRKCTRID) AND (C.PRODID=B.PRODID)) AND …


1
阅读部分更新的行?
假设我有两个查询,分别在SSMS中的两个会话中运行: 第一届会议: UPDATE Person SET Name='Jonny', Surname='Cage' WHERE Id=42 第二届会议: SELECT Name, Surname FROM Person WITH(NOLOCK) WHERE Id > 30 该SELECT语句是否可能读取半更新的行,例如带有Name = 'Jonny'和的行Surname = 'Goody'? 查询几乎在单独的会话中同时执行。

2
查询列出数据库的加密证书
使用什么证书来加密实例上的每个数据库。 我可以使用以下方法获取数据,但是如何编写查询 USE master GO -- this provides the list of certificates SELECT * FROM sys.certificates -- this provides the list of databases (encryption_state = 3) is encrypted SELECT * FROM sys.dm_database_encryption_keys WHERE encryption_state = 3; 我注意到sys.certifcates.thumbprint和sys.dm_database_encryption_keys.encryptor_thumbprint列包含相同的数据。

2
减少varchar列的大小对数据库文件有什么影响?
我们数据库中有许多表,这些VARCHAR(MAX)表中的列VARCHAR(500)(或比max小得多)足以满足需要。自然,我想清理它们,并将尺寸减小到更合理的水平。我了解的“方法”是:我的问题是更改这些列会对磁盘上​​的页面和现存内容产生什么影响?(那里有很多关于增长一列时会发生什么的信息,但是很难找到收缩一列时会发生什么的信息。) 有些表的行数非常小,因此我不担心更改的成本,但有些表却很大,并且担心它们可能会被重组并导致大量阻塞/停机。实际上,我只想一种估计维护时段的方法。通常,我想更好地了解这种情况下数据库引擎的行为。 提前致谢! 编辑: 我正在查看20个表,尽管其中只有一半的行数大于1,000。最大的行将近一百万行。犯规最严重的是一张有350,000行和4 VARCHAR(MAX)列的表,可以缩小到该VARCHAR(500)水平。

1
为什么在唯一索引扫描后使用聚合运算符
我有一个带有唯一索引的表,该索引针对非空值进行了过滤。在查询计划中,使用了distinct。是否有一个原因? USE tempdb CREATE TABLE T1( Id INT NOT NULL IDENTITY PRIMARY KEY ,F1 INT , F2 INT ) go CREATE UNIQUE NONCLUSTERED INDEX UK_T1 ON T1 (F1,F2) WHERE F1 IS NOT NULL AND F2 IS NOT NULL GO INSERT INTO T1(f1,F2) VALUES(1,1),(1,2),(2,1) SELECT DISTINCT F1,F2 FROM T1 WHERE F1 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.