标签: sql-server

为不同的 SQL Server 架构设置用户权限

我需要限制对特定用户的访问,但他们仍然需要能够查看 dbo 拥有的表中的数据。

我正在尝试执行以下操作:

  1. dbo 架构正常运行,可以访问所有内容
  2. schema1 架构只能访问 schema1 对象
  3. 如果 schema1 视图或存储过程访问 dbo 拥有的表中的数据,则权限链适当
  4. user1 可以访问 schema1,没有其他权限;除了#3的情况

这是我尝试过的:

  1. 使用随机密码创建映射到测试登录的 user1 用户
  2. 在 dbo 模式中创建了几个表,其中包含一些测试数据
  3. 创建了 schema1 架构
  4. 创建了一个 schema1.get_profiles,它从一个名为 schema1.profiles 的视图中进行选择,该视图访问 dbo.people、dbo.taglinks 和 dbo.tags 中的数据

但是,在以 user1 身份登录时使用以下语句:

EXEC get_profiles 1
Run Code Online (Sandbox Code Playgroud)

结果是:

The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'.
Run Code Online (Sandbox Code Playgroud)

我已经尝试过WITH EXECUTE AS OWNER并且无法开始理解“所有权链接”应该如何工作。

我也试过

GRANT EXECUTE ON SCHEMA::schema1 TO user1
GRANT INSERT ON SCHEMA::schema1 TO user1
GRANT SELECT ON SCHEMA::schema1 TO …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server stored-procedures

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

为什么子查询使用并行性而连接不使用?

为什么 SQL Server 在运行使用子查询的查询时使用并行性,但在使用连接时不使用并行性?加入版本串行运行,需要大约 30 倍的时间才能完成。

加入版本:~30secs

在此处输入图片说明

子查询版本:<1 秒

在此处输入图片说明

编辑: Xml 版本的查询计划:

加入版本

子查询版本

join sql-server subquery

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

SQL Server 中的跨数据库查询是否昂贵?

SQL Server 中的跨数据库查询是否昂贵?所有数据库都在同一个实例中。

sql-server

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

角色 db_owner 允许什么

我一直在尝试解决无法查看 SQL Server 2012 数据库中某些表的登录问题。在这样做时,我发现我不太了解db_owner角色中的成员资格允许的内容。我可以理解其他角色,db_datareader and db_datawriter但我对db_owner允许的内容仍然感到困惑。

security sql-server sql-server-2012

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

读取部分更新的行?

假设我有两个查询,在 SSMS 中的两个单独会话中运行:

第一节:

UPDATE Person
SET Name='Jonny', Surname='Cage'
WHERE Id=42
Run Code Online (Sandbox Code Playgroud)

第二场:

SELECT Name, Surname
FROM Person WITH(NOLOCK)
WHERE Id > 30
Run Code Online (Sandbox Code Playgroud)

SELECT语句是否有可能读取半更新的行,例如带有Name = 'Jonny'和的行Surname = 'Goody'

查询几乎在不同的会话中同时执行。

sql-server concurrency

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

创建多个级别的层次结构,其中每个节点都有随机数量的子节点

我需要创建一些涉及层次结构的测试数据。我可以让它变得简单并做几个CROSS JOINs,但这会给我一个完全统一/没有任何变化的结构。这不仅看起来很乏味,而且测试数据缺乏变化有时会掩盖原本会发现的问题。所以,我想生成一个遵循以下规则的非统一层次结构:

  • 3 层深
    • 1 级随机 5 - 20 个节点
    • 级别 2 是 1 - 10 个节点,每个级别 1 的每个节点随机
    • 级别 3 是 1 - 5 个节点,每个级别 2 的每个节点随机
  • 所有分支都将有 3 层深。在这一点上,深度的均匀性是可以的。
  • 任何给定级别上的子节点的名称都可以重叠(即子节点的名称在同一级别的所有节点中不需要是唯一的)。
  • 术语“随机”在这里定义为伪随机,而不是唯一随机。这需要提及,因为术语“随机”通常用于表示“不产生重复的给定集合的随机排序”。我接受 random = random 并且如果级别 1 的每个节点的子节点数仅为 4、7 和 8,即使级别 1 上的 20 个节点每个节点的潜在分布为 1 - 10 个子节点,那很好,因为这就是随机。
  • 尽管使用嵌套WHILE循环可以很容易地做到这一点,但首选是找到一种基于集合的方法。一般而言,生成测试数据没有生产代码对效率的要求,但尝试基于集合的方法可能会更具教育意义,并有助于在未来找到基于集合的方法来解决问题。因此WHILE,不排除循环,但只有在不可能使用基于集合的方法时才能使用循环。
  • Set-based = 理想情况下是单个查询,无论 CTE、APPLY 等如何。因此使用现有或内联数字表很好。使用 WHILE / CURSOR / 程序方法是行不通的。我想将部分数据暂存到临时表或表变量中就可以了,只要操作都是基于集合的,没有循环。然而,话虽如此,单查询方法可能比多查询更受青睐,除非可以证明多查询方法实际上更好。另请记住,“更好”的构成通常是主观的;-)。还请记住,前一句中“典型地”的用法也是主观的。
  • 任何版本的 SQL Server(我想是 2005 和更新版本)都可以。
  • 只有纯 T-SQL:没有那些愚蠢的 SQLCLR 东西!!至少在生成数据方面。将使用 SQLCLR 创建目录和文件。但在这里,我只是专注于产生要创造的价值。 …

sql-server hierarchy random t-sql

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

如何查询 SSISDB 以找出包中的错误?

我看过这个问题 SSIS 2012 - How to Query Current Running Packages in 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
,   E.stopped_by_name
,   E.dump_id
,   E.server_name
,   E.machine_name
,   E.total_physical_memory_kb
,   E.available_physical_memory_kb
,   E.total_page_file_kb
,   E.available_page_file_kb
,   E.cpu_count
,   F.folder_id
, …
Run Code Online (Sandbox Code Playgroud)

sql-server ssis troubleshooting sql-server-2014 ssis-2014

16
推荐指数
3
解决办法
6万
查看次数

确定每个月的第三个星期五

我需要确定 SQL Server 中日期范围“1.1.1996 - 30.8.2014”的“每个月的第三个星期五”的日期。

我希望我应该使用的组合DENSE_RANK(),并PARTITION BY()以一套“等级= 3”。但是,我是 SQL 新手,无法找到正确的代码。

sql-server date-format sql-server-2012 date

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

如何获得同一表上不同列的计数

表#01 Status

StatusID    Status
-----------------------
 1          Opened
 2          Closed
 3          ReOpened
 4          Pending
Run Code Online (Sandbox Code Playgroud)

表#02 Claims

ClaimID     CompanyName StatusID
--------------------------------------
1               ABC     1
2               ABC     1
3               ABC     2
4               ABC     4
5               XYZ     1
6               XYZ     1
Run Code Online (Sandbox Code Playgroud)

预期结果:

CompanyName TotalOpenClaims TotalClosedClaims TotalReOpenedClaims TotalPendingClaims
--------------------------------------------------------------------------------
ABC                 2           1                      0               1
XYZ                 2           0                      0               0
Run Code Online (Sandbox Code Playgroud)

我需要如何编写查询才能按预期获得结果?

sql-server pivot

16
推荐指数
2
解决办法
8万
查看次数

SQL server DB status runnable、sleeping、suspended、running、background含义

我无法理解 DB Session 状态的含义。我搜索了一些参考资料,但没有得到任何帮助。任何人都可以解释这些状态(可运行、睡眠、暂停、运行和后台)的实际含义,这对我有很大帮助。提前致谢。

sql-server

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