标签: sql-server-2008

这是否意味着“公共”具有完全选择、插入、更新和删除访问权限?

我正在尝试创建一个SQL Server 2008 R2只能从一个 SQL 视图中进行选择的新数据库用户。但是,无论我在以这个新用户身份登录时尝试什么,我都可以从任何表中进行选择。我运行了这个查询:

select  princ.name
,       princ.type_desc
,       perm.permission_name
,       perm.state_desc
,       perm.class_desc
,       object_name(perm.major_id)
from    sys.database_principals princ
left join
        sys.database_permissions perm
on      perm.grantee_principal_id = princ.principal_id
WHERE princ.name = 'public'
AND object_name(perm.major_id) = 'User_Table'
Run Code Online (Sandbox Code Playgroud)

并得到这些结果:

name    type_desc       permission_name     state_desc  class_desc          (No column name)
public  DATABASE_ROLE   DELETE              GRANT       OBJECT_OR_COLUMN    User_Table
public  DATABASE_ROLE   INSERT              GRANT       OBJECT_OR_COLUMN    User_Table
public  DATABASE_ROLE   REFERENCES          GRANT       OBJECT_OR_COLUMN    User_Table
public  DATABASE_ROLE   SELECT              GRANT       OBJECT_OR_COLUMN    User_Table
public  DATABASE_ROLE   UPDATE              GRANT       OBJECT_OR_COLUMN    User_Table
Run Code Online (Sandbox Code Playgroud)

这是否意味着无论登录到数据库的任何人都具有基于“公共”权限的完全访问权限?

sql-server-2008 security sql-server permissions sql-server-2008-r2

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

在保留 IDENTITY 的同时将行插入其他表

我正在 SQL Server 表上执行 ETL 逻辑。我要将数据从一张表同步到另一张表。对于需要基于源表添加到目标表的所有记录,我正在对目标表中的这些行进行插入。架构将其中一列定义为标识列。因此 SQL Server 会自动增加插入的新行的 id。因为我要移动现有的 id,所以我需要删除标识,插入这些行,然后重新应用标识,然后重置种子以使其与源表匹配。这如何以编程方式完成?

  1. 我可以从现有列中删除身份声明吗?
  2. 我可以将现有列标记为身份吗?
  3. 如何重置标识列的种子?

sql-server-2008 sql-server etl t-sql identity

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

为什么我必须在 SQL Server 2012 中删除快照才能还原数据库?

我从来不需要使用 SQL Server 2008 删除快照,但是现在当我尝试在 SQL Server 2012 中恢复时,出现错误:

System.Data.SqlClient.SqlError:无法对具有数据库快照或活动 DBCC 副本的数据库执行该操作。

为什么这在 2012 年是必要的,而不是在 2008 年?

sql-server-2008 sql-server-2012

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

数据库快照的采用和使用有多广泛?

在阅读了数据库快照之后,它们似乎作为小 DDL 和 DML 更改的备份和快速恢复方法很有用。此外,它们对于大规模开发/测试环境很有用。

我的预期用途是在我们的测试环境中,我们需要测试 DDL/DML 脚本并希望恢复到以前的状态而不需要很长的恢复时间。这里除了快照之外还有其他方法吗(不包括虚拟机解决方案)?这是否已被广泛采用,是否有任何需要注意的问题?我试图了解 MS 文档和我读过的少数博客之外的社区。如果您认为在线提供的文档具有代表性,那么这对我来说是一个很好的答案。

再次感谢各位大师!

sql-server-2008 sql-server snapshot

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

超类型/子类型的历史表设计

我正在设计一个跟踪 IT 硬件的资产管理数据库。我决定使用超类型/子类型设计。我现在想跟踪设备更改的历史记录。我想使用单独的历史表,但我无法决定如何跟踪对子类型表所做更改的历史记录。

如果我为每个子类型表使用单独的历史表,我可以通过将它们与超类型历史表连接来重建记录,除非子类型历史表独立于超类型历史表而改变。独立地,我的意思是对超类型表中的数据进行了x 次更新,创建了x 次超类型历史记录,对子类型表进行了y 次更新,创建了y次子类型历史记录。如果在同一天进行更改,我将如何重建记录?

这是对超类型/子类型的良好使用,还是我应该对表进行非规范化?否则,有人可以建议任何方法来解决此类设计的历史问题吗?

使用 MS SQL Server 2008。

这是一个非常简化的 ERD:

ERD

sql-server-2008 normalization database-design

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

索引键列顺序

我为多对多关系创建了一个连接表。

该表中只有 2 个列,ticketid并且groupid

典型的数据是

groupid    ticketid
20         56  
20         87
20         96
24         13
24         87
25         5
Run Code Online (Sandbox Code Playgroud)

我的问题是在创建复合键时我应该ticketid遵循groupid

CONSTRAINT [PK_ticketgroup] PRIMARY KEY CLUSTERED 
    (
        [ticketid] ASC,
        [groupid] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

或者groupid反过来ticketid

CONSTRAINT [PK_ticketgroup] PRIMARY KEY CLUSTERED 
        (
            [groupid] ASC,
                    [ticketid] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = …
Run Code Online (Sandbox Code Playgroud)

index sql-server-2008 sql-server primary-key

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

执行顺序删除和未提交读

我们正在使用动态 SQL 运行以下查询,当我们运行并发实例时,它会在少数情况下出错。错误是:

由于数据移动,无法使用 NOLOCK 继续扫描...

这个问题说当一个进程读取另一个进程正在删除的数据时会抛出这个错误。我们的过程是删除和读取相同的行,但是按照以下查询一个接一个地读取(在SELECT之后DELETE):

DELETE FROM Table1
WHERE colum1 = somevalue1
AND column2 = somevalue2

SELECT COUNT(*) 
FROM Table1 WITH (NOLOCK)
WHERE colum1 = somevalue1
AND column2 = somevalue2
Run Code Online (Sandbox Code Playgroud)

我试图了解上述查询的执行。由于SELECT未提交,它是否在提交之前开始执行DELETE?这是否意味着删除NOLOCK提示会停止错误?

sql-server-2008 sql-server isolation-level nolock

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

如何查找已在数据库上执行的 DELETE 和 UPDATE 语句?

我试图找出在某个时间段内在某个数据库上执行了哪些删除和更新语句。

我遇到了以下查询,但它生成了一条错误消息:

SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
where dest.TEXT like '%Delete%from%'
ORDER BY deqs.last_execution_time DESC
Run Code Online (Sandbox Code Playgroud)

错误信息是:

消息 102,级别 15,状态 1,第 3 行“.”附近的语法不正确。

如果我尝试:

SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS dest
where dest.TEXT like '%Delete%from%'
ORDER BY deqs.last_execution_time DESC
Run Code Online (Sandbox Code Playgroud)

我收到另一个错误:

Msg 321, Level 15, State 1, Line 3
"sql_handle" is not a recognized table hints option. If it is intended as …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server audit

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

在 SQL Server 中从 SSMS 向导添加列

今天,我正在阅读 Pinal Dave 的关于在...中添加列的博客。SQL SERVER让我惊讶的是,从 SSMS 向导添加列时,它来自以下过程:

  • 使用新列创建新表
  • 将上一个表中的数据插入到新表中
  • 重做所有的键和约束
  • 删除旧表重命名
  • 新表使用旧表的名称

为什么SQL SERVER要走这么耗时耗资源的过程?这么长的过程有什么好处吗....

sql-server-2008 sql-server ssms

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

SQL Server 架构所有权

我目前正在学习 SQL Server 2008 并且遇到了模式,我不明白他们必须有一个所有者的一件事;为什么他们不能拥有自己?

我的背景主要是 Java,听起来架构就像一个没有所有者的包。

sql-server-2008

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