Questions tagged «sql-server»

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

3
SQL Server:在视图中而不是在其表中授予对用户的选择访问权限
我有一个带有几个数据库的SQL Server 2012实例。在其中一个视图中,我创建了一个视图,该视图在多个数据库中选择表。 我希望用户能够选择该视图,但是它不能选择其表。正是由于用户无法选择表而创建了视图。 我已阅读/programming/368414/grant-select-on-a-view-not-base-table和http://msdn.microsoft.com/zh-cn/library/ms188676。 aspx仍然无法正常工作。 如果我GRANT SELECT TABLE TO USER对所有表都执行操作,则用户可以选择视图。但是,如果我撤消到任何表,它将失败。 这应该是一个简单的过程,但是我很难使它起作用。我曾经见过它发生过(实例的所有者为我提供了访问视图的权限,但未在其表中进行操作),但我无法做到这一点或找不到某个知道怎么做的人。 有人可以给我提供有关如何做的教程或代码示例吗? 当用户SELECTs查看我的消息时: 对对象<TABLE>,数据库<DB>,模式的SELECT权限被拒绝dbo。 如果我将select授予该表,则错误消息会将表名更改为该视图读取的另一个表。

2
了解统计信息,执行计划和“升序关键问题”
我试图更好地(从概念上)理解统计信息,执行计划,存储过程执行之间的关系。 我是否正确地说统计仅在为存储过程创建执行计划时使用,而没有在实际执行上下文中使用?换句话说,如果这是真的,那么一旦创建了计划(并假设其已正确使用),“最新”统计数据的重要性如何? 我读过的一篇文章(《统计》,《行估计》和《升序的日期》栏)使我特别受启发,该文章描述了一种非常类似于我每天都使用客户数据库的情况。 在我们使用特定存储过程定期查询的最大表之一中,我们有一个升序的日期/时间列。 当每天增加十万行时,如何防止执行计划变得过时? 如果我们经常更新统计信息以解决此问题,那么在此存储过程的查询中使用OPTION(RECOMPILE)提示是否有意义? 任何意见或建议,将不胜感激。 更新:我正在使用SQL Server 2012(SP1)。



3
级联主键更新为所有引用的外键
是否可以通过在引用该引用的所有外键之间级联更新来更新主键列值? #编辑1: 当我运行followinq查询 select * from sys.foreign_keys where referenced_object_id=OBJECT_ID('myTable') ,我看到update_referential_action设置为0。因此,在更新主键列之后不执行任何操作。如何更新外键以使其成为CASCADE UPDATE? #编辑2: 为了脚本化脚本中所有外键的创建或删除,请运行以下脚本(从此处获取) DECLARE @schema_name sysname; DECLARE @table_name sysname; DECLARE @constraint_name sysname; DECLARE @constraint_object_id int; DECLARE @referenced_object_name sysname; DECLARE @is_disabled bit; DECLARE @is_not_for_replication bit; DECLARE @is_not_trusted bit; DECLARE @delete_referential_action tinyint; DECLARE @update_referential_action tinyint; DECLARE @tsql nvarchar(4000); DECLARE @tsql2 nvarchar(4000); DECLARE …

2
没有PARTITION BY的ROW_NUMBER()仍会生成细分迭代器
我正在写我即将发表的有关排名和聚合窗口函数的博客文章,特别是Segment和Sequence Project迭代器。据我了解,Segment会识别流中构成组末尾的行,因此请执行以下查询: SELECT ROW_NUMBER() OVER (PARTITION BY someGroup ORDER BY someOrder) 将使用Segment来区分某行何时属于上一行以外的其他组。然后,Sequence Project迭代器根据Segment迭代器输出的输出进行实际的行号计算。 但是,使用该逻辑的以下查询不必包含细分,因为没有分区表达式。 SELECT ROW_NUMBER() OVER (ORDER BY someGroup, someOrder) 但是,当我尝试此假设时,这两个查询都使用Segment运算符。唯一的区别是第二个查询不需要GroupBy在细分上输入。难道不是一开始就不需要细分吗? 例 CREATE TABLE dbo.someTable ( someGroup int NOT NULL, someOrder int NOT NULL, someValue numeric(8, 2) NOT NULL, PRIMARY KEY CLUSTERED (someGroup, someOrder) ); --- Query 1: SELECT …

5
SQL Server 2012无法使用计算机帐户登录
我们正在将IIS / SQL Server网站从2008年迁移到2012年,但身份验证存在问题。我们使用Windows身份验证将身份验证为DOMAIN\COMPUTER$,但这不起作用,并显示一条错误消息: 用户“ DOMAIN \ COMPUTER $”的登录失败。原因:找不到与提供的名称匹配的登录名。[客户:<本地计算机>] 我已经验证了该帐户的存在,甚至删除并重新创建了该帐户 create login "DOMAIN\COMPUTER$" from windows 如果再次执行此操作,则会收到响应: 消息15025,级别16,状态2,第1行 服务器主体“ DOMAIN \ COMPUTER $”已存在。 (DOMAIN\COMPUTER用真实域名和计算机名代替) 因此,似乎该站点正在查询SQL Server,但是SQL Server并不是很努力地查看其登录名。 我错过了什么?

3
将有关已删除记录的信息传递到“删除”触发器上
在设置审计跟踪时,我没有问题可以跟踪谁在更新或在表中插入记录,但是,跟踪谁删除记录似乎更成问题。 我可以通过在“插入/更新”字段中包含“ UpdatedBy”字段来跟踪插入/更新。这使INSERT / UPDATE触发器可以通过来访问字段“ UpdatedBy” inserted.UpdatedBy。但是,使用Delete触发器不会插入/更新数据。有没有一种方法可以将信息传递到Delete触发器上,以便它可以知道谁删除了记录? 这是一个插入/更新触发器 ALTER TRIGGER [dbo].[trg_MyTable_InsertUpdate] ON [dbo].[MyTable] FOR INSERT, UPDATE AS INSERT INTO AuditTable (IdOfRecordedAffected, UserWhoMadeChanges) VALUES (inserted.ID, inserted.LastUpdatedBy) FROM inserted 使用SQL Server 2012

1
具有Advanced Services的SQL Server 2014 Express是否实际上支持全文搜索?
我已经安装了具有高级服务的SQL Server 2014 Express版。我希望尝试全文搜索功能。我在这里阅读到,2014 Express Edition支持全文本搜索。但是,在安装并尝试创建全文索引后,出现错误,指出此版本的sql server不支持全文索引。 实际是否支持全文索引?我是否有可能安装了错误的版本(不是高级服务)?为了确定,我已经卸载并重新安装了两次,但是两次都相同。我很肯定我正在使用高级服务安装程序进行安装。 我使用的是Windows 7(64位)。


1
Sch-M WAIT阻止SQL Server 2014中的Sch-S,但不阻止SQL Server 2008 R2?
最近,我们将生产实例从SQL 2008 R2迁移到了全新的SQL 2014服务器。我们通过使用Service Broker发现了一个有趣的场景。考虑Broker Enabled = true带有MyService和的数据库MyQueue。在此队列上禁用了毒药消息处理。队列中至少有2条活动会话与消息。 在一个进程(SPID 100)中执行: BEGIN TRANSACTION; DECLARE @conversation_group_id UNIQUEIDENTIFIER; RECEIVE TOP (1) @conversation_group_id = conversation_handle FROM MyQueue; 请注意,我们保持交易未结。想象这是一个.NET程序,它在某些外部资源上等待了很长时间。通过sys.dm_tran_locks我们看到,此SPID已被授予队列上的IX锁。 | type | resource_id | mode | status | spid | | OBJECT | 277576027 | IX | GRANT | 100 | 在一个单独的进程(SPID 101)中执行五次: BEGIN TRANSACTION; …

1
序列正在重用
我有一个序列,可以为系统中的对象生成跟踪号。它已经运行了一段时间了。 上周,我们注意到它开始重新使用值。 似乎发生的事情是,在晚上的不同时间点,它将回滚到前一天的值。然后它将继续从该点生成值。 因此,例如,我可以得到这样的东西: 10112 10113 10114 10115 10116 10117 10118 10113 10114 10115 10116 ... 何时发生,第一次使用与第二次使用之间的持续时间(少至10分钟或几小时)或回滚了多少(少至1次至数百次)似乎没有任何规律。 我曾考虑过运行跟踪(现在仍然可以),但是我认为序列对象没有被直接修改。我认为这是因为修改日期已经过了几天,并且指出了我们手动提高该值以尝试消除重复项的时间。(此后此问题已经发生过好几次了。) 是否有人知道每晚可能导致序列回滚和重用值的原因? 更新:要回答评论中的几个问题: @@Version: Microsoft SQL Server 2012(SP1)-11.0.3000.0(X64)2012年10月19日13:38:57 创建脚本: CREATE SEQUENCE [schemaName].[SequenceName] AS [bigint] START WITH 410014104 INCREMENT BY 1 MINVALUE 410000000 MAXVALUE 419999999 CYCLE CACHE GO 我没有唯一约束(但我打算穿上)。但是,这只会让我知道何时重用了值。不是什么导致值重置。我的工作是每5分钟保存一个新值。时间和价值跳跃没有遵循规律。 我已经检查了事件日志,看是否有错误。唯一正在发生的事情是这样的:http : //support.microsoft.com/kb/2793634 我们今天正在应用此修复程序。我不认为这些是相关的,但是可能是相关的。

1
删除语句死锁
运行SQL Server作业时出现死锁。死锁发生在简单的DELETE语句上。我本以为必须要运行SELECT / UPDATE查询才能引起死锁?但是看起来是DELETE / DELETE死锁... 我要寻找的是为什么会出现DELETE / DELETE死锁。(据我所知)传递了不同的参数。 有任何想法吗?谢谢。 deadlock-list 2014-05-20 07:30:09.66 spid25s deadlock victim=process409048 2014-05-20 07:30:09.66 spid25s process-list 2014-05-20 07:30:09.66 spid25s process id=process409048 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127294 waittime=4352 ownerId=629860973 transactionname=DELETE lasttranstarted=2014-05-20T07:30:05.307 XDES=0x397219620 lockMode=U schedulerid=5 kpid=3792 status=suspended spid=150 sbid=0 ecid=3 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:05.307 lastbatchcompleted=2014-05-20T07:30:05.307 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed …

1
恢复差异备份会创建DEFUNCT日志文件吗?
这是我的问题。我正在尝试通过完全还原将数据库移动到新服务器,然后使用快速差异备份/还原进行切换。我可以完全还原,但是还原差异备份时会收到以下警告: 消息3127,级别16,状态1,行1还原的数据库'DatabaseName'的文件'Database_Log2'处于关闭状态,因为该数据库正在使用简单恢复模型,并且该文件被标记为可读写访问。因此,只能通过逐段还原来恢复只读文件。 数据库已还原并被视为联机,但是由于此DEFUNCT文件而导致的任何备份操作失败,并出现以下错误: 消息3636,级别16,状态2,行1处理数据库ID 10文件ID 6的“ BackupMetadata”元数据时发生错误。消息3046,级别16,状态2,行1元数据不一致。唯一可能的备份操作是使用WITH CONTINUE_AFTER_ERROR或NO_TRUNCATE选项进行尾日志备份。消息3013,级别16,状态1,第1行BACKUP DATABASE异常终止。 如果我对完整文件和差异文件执行RESTORE FILELISTONLY,则两者都给我相同的输出,这与我从源数据库上的sys.database_files中看到的输出匹配。服务器为Developer Edition上的SQL2012 SP1。 我可以进行完整备份,然后立即进行差异处理,然后将这些文件还原到同一服务器上的其他数据库中,并看到完全相同的问题,因此造成差异的原因与创建差异有关。如果使用“恢复”还原完整备份,则没有问题。我不知道该文件是否曾经存在于该数据库中,但是该文件很可能曾经存在并且很久以前就被删除了。如果我在已还原的数据库上查询sys.database_files,则DEFUNCT文件具有drop_lsn的值,似乎可以确认这一点。当前,源数据库中只有一个文件组(PRIMARY),4个数据文件和一个日志文件。 有任何想法吗?

2
SQL Job步骤作为其他SQL帐户运行
我很好奇如何设置要作为其他SQL登录帐户执行的SQL作业步骤。看来我需要设置一个需要现有凭据的新代理帐户。创建凭据时,我唯一的选择是使用Windows登录凭据。 我尝试运行的作业如下。还有其他一些语句,但是当我将作业步骤设置为以SQL登录名运行时,它将失败。 insert into [dbo].[TableA] SELECT ss.[Ref_ID] ,mm.[studentID] ,mm.[studentPersonID] ,mm.[studentFirstname] FROM [dbo].[TableB] mm left outer join [dbo].[TableC] ss on ss.parentPersonID=mm.parentPersonID and mm.studentPersonID = ss.studentPersonID where ss.Ref_ID is not null; 通过SQL作业步骤运行此命令时,它将失败。 Executed as user: an_admin_account. Access to the remote server is denied because the current security context is not trusted. [SQLSTATE …

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.