标签: sql-server

拒绝用户在 master 中创建表的权限

我注意到我可以在master数据库中创建表、模式、存储过程等。

我不知道是什么授予此权限。这很烦人,因为当我们在 SSMS 中打开一个 *.sql 文件时,它默认与master 相关。如果在CREATE没有注意到并设置正确的数据库上下文的情况下执行操作,则在master 中创建表。

如果我们没有权限,我们会得到一个错误,注意到它并更改数据库上下文。有了权限,表就创建好了,后面我们才看到错误,需要删除重新创建。我注意到在master中已经错误地创建了一些表。

我想撤销每个人类用户的许可,但我害怕破坏某些东西。我不知道某些 SQL Server 例程是否需要在那里创建的权限。

在不破坏 SQL Server 的情况下从master撤销创建权限的最佳方法是什么?

security sql-server permissions sql-server-2012 master-system-database

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

是否可以仅在订阅者中更改表的主键(从非集群到集群)而不破坏复制?

我有一个表,它有一个聚集唯一索引和一个与索引结构相同的非聚集主键。

IF OBJECT_ID('[dbo].[tblBAccountHolder]') IS NOT NULL 
DROP TABLE [dbo].[tblBAccountHolder] 
GO
CREATE TABLE [dbo].[tblBAccountHolder] ( 
[lngParticipantID]  INT                              NOT NULL,
[sdtmCreated]       SMALLDATETIME                    NOT NULL,
[strUsername]       VARCHAR(20)                          NULL,
[strPassword]       VARCHAR(20)                          NULL,
[tsRowVersion]      TIMESTAMP                        NOT NULL,
CONSTRAINT   [PK_tblAccountHolder]  
PRIMARY KEY NONCLUSTERED ([lngParticipantID] asc),

CONSTRAINT   [IX_tblBAccountHolder__lngParticipantID]  
UNIQUE CLUSTERED    ([lngParticipantID] asc) 
WITH FILLFACTOR = 100)
Run Code Online (Sandbox Code Playgroud)

正如您在定义中看到的那样,只有一列:

 CREATE  UNIQUE CLUSTERED INDEX IX_tblBAccountHolder__lngParticipantID 
 ON [dbo].[tblBAccountHolder] (  [lngParticipantID] ASC  )  
Run Code Online (Sandbox Code Playgroud)

我想删除唯一索引,并更改主键以使其成为集群。我将保留相同的主键,只需将其从非集群更改为集群。

该表是事务复制的一部分,我只会在订阅者数据库上完成此操作。不在发布者中。

这是一个包含超过 9,293,193 行的表格。

我会搞砸复制吗?

问题是我必须删除主键约束并将其重新创建为集群。

这是我想在订阅者数据库中完成的操作:

drop INDEX IX_tblBAccountHolder__lngParticipantID 
        ON [dbo].[tblBAccountHolder]  
GO

ALTER TABLE [dbo].[tblBAccountHolder] 
       drop CONSTRAINT …
Run Code Online (Sandbox Code Playgroud)

replication sql-server transactional-replication sql-server-2014 automation

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

大表连接的 OrderBy int 慢

我有大约 150 万条记录。此查询适用于较小的数据,但每几十万条记录就会慢一秒。对于 150 万,查询明显困难。

我模拟了一个全新的 Code First 项目来验证问题与我的实现无关,并提供以下示例查询:

    SELECT TOP 1 Widgets.*
    FROM [WidgetSandbox].[dbo].[Widgets] Widgets
    INNER JOIN [WidgetSandbox].[dbo].[Status] Statuses ON Widgets.StatusId = Statuses.Id
    INNER JOIN [WidgetSandbox].[dbo].[Colors] Colors ON Widgets.ColorCode = Colors.ColorCode
    INNER JOIN [WidgetSandbox].[dbo].[Sizes] Sizes ON Widgets.SizeId = Sizes.Id
    WHERE Statuses.Name = 'Available'
    AND Colors.Name = 'Red'
    ORDER BY Sizes.DiameterInches
Run Code Online (Sandbox Code Playgroud)

DiameterInches 是一个int, 作为我实际代码中“PriorityLevel”的隐喻。

如果我注释掉ORDER BY Sizes.DiameterInches,它会立即返回,但如果我想找到“最小的可用红色小部件”,它就会爬行。

有没有更好的办法?

在此处输入图片说明

执行计划 XML:https : //gist.github.com/RobertBaldini/57c8b61d135cc5c84c38b2da243611ad

DDL:https : //gist.github.com/RobertBaldini/3740c7bb85eea47d7fe63cb8602ac2d6

回购(数据加载器需要几分钟):https : //github.com/RobertBaldini/WidgetSandbox

performance sql-server execution-plan query-performance

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

备份错误消息 3201,级别 16,状态 1,第 1 行和操作系统错误 3

当我在网络共享驱动器中进行备份时,下面提到了 TSQL。

Use DatabaseName
Go
Backup Database DatabaseName
To Disk=N'H:\DatabaseBackup\DatabaseName.bak';
Go
Run Code Online (Sandbox Code Playgroud)

我在 SSMS 中收到以下错误。

 Msg 3201, Level 16, State 1, Line 1
Run Code Online (Sandbox Code Playgroud)

无法打开备份设备'H:\DatabaseBackup\DatabaseName.bak'操作系统错误 3(系统找不到指定的路径。)。

Msg 3013, Level 16, State 1, Line 1
Run Code Online (Sandbox Code Playgroud)

BACKUP DATABASE 异常终止。

因为我已经通过这个 TSQL 检查了 'xp_cmdshell' 。run_value & config_value 如下:

name       minimum  maximum config_value    run_value
xp_cmdshell 0           1     1               1
Run Code Online (Sandbox Code Playgroud)

注意:这里H是我的网络共享。

任何建议将不胜感激。

sql-server backup sql-server-2012

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

如果在select语句中不为空,如何替换列?

我有一个联系人(ID、名字、姓氏、中间名)。

例如:

| ID | FirstName | LastName | MiddleName |
|====|===========|==========|============|
| 1  | Mark      |Jordan    | E          |
|----|-----------|----------|------------|
| 2  | James     | Blunt    | NULL       | 
|----|-----------|----------|------------|
Run Code Online (Sandbox Code Playgroud)

我要输出

Mark E. Jordan
James Blunt
Run Code Online (Sandbox Code Playgroud)

因此,如果 MiddleName 不为空,则添加一个 '.' 之后,否则输出空值。

我知道isnull函数,但是我需要的是isnotnull函数。如何完成查询?

到目前为止我的查询:

select FirstName + ' ' + isnull(...)  + LastName
from Contact
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql functions

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

限制记录数取决于主键的部分

我为足球比赛创建了数据库。

我有 2 个具有多对多关系的表,因此我还创建了一个连接表:

裁判

CREATE TABLE referee (
  id_referee INT IDENTITY PRIMARY KEY,
  id_type_referee INT NOT NULL,
  first_name varchar(20) NOT NULL,
  last_name varchar(30) NOT NULL,
  date_of_birth DATE NOT NULL,
  FOREIGN KEY(id_type_referee) REFERENCES type_referee(id_type_referee)
);
Run Code Online (Sandbox Code Playgroud)

比赛

CREATE TABLE match (
  id_match INT IDENTITY PRIMARY KEY,
  id_stadium INT NOT NULL REFERENCES stadium(id_stadium),
  id_season INT NOT NULL REFERENCES season(id_season),
  date_of_match DATE NOT NULL,
  audience INT CHECK (audience>=0)
);
Run Code Online (Sandbox Code Playgroud)

接线台

CREATE TABLE match_referee(
  id_referee INT NOT NULL,
  id_match INT NOT NULL,
  PRIMARY KEY(id_referee,id_match), …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server constraint

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

进程的 SPID 更改?

在 SQL Server 2012 上,进程 SPID 可以在操作中更改吗?我们有一个非常独特的查询,我们一直在监视(生产,但受控测试),并且在不同的时间间隔使用不同的 SPID 看到它。这是一个独特的查询,其他人不应该运行,至少使用这些参数,因此我们不应该使用不同的 SPID 来查看它,除非......查询可以在过程中更改 SPID 吗?

我的理解是这是不可能的,所以更有可能是由于某些未知原因,尽管没有用户交互,但应用程序正在重新提交这个独特且破坏性能的查询,从而生成一个新的 SPID。

performance sql-server stored-procedures

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

SQL Server -- 重复(几乎)相同子查询的更有效替代方法

我需要提高 WHERE 子句中多个子查询的效率。上下文是现有产品的报告生成器。 我可以提供的唯一输入是 WHERE 子句。我有 3 个几乎相同的子查询,它们之间只有 1 个不同。我需要验证至少有 1 条记录符合每个条件。

这是查询的要点

Where
  Exists (Select 1 From t1  ...etc... where ...etc... and fld1='X')
  AND
  Exists (Select 1 From t1  ...etc... where ...etc... and fld1='Y')
  AND
  Exists (Select 1 From t1  ...etc... where ...etc... and fld1='Z')
Run Code Online (Sandbox Code Playgroud)

3 个子查询中的每一个中的“选择”都是相同的。它确实加入并在它的 Where 子句中有其他字段,包括对来自外部查询的 PK 的引用:我只显示不同之处。

t1 中大约有 50 万条记录。上面的查询现在已经运行了 30 多分钟。我需要把它缩短到 30 秒。

我的选择非常有限——没有 DECLARE,没有临时表,没有“OVER”。

sql-server subquery where

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

在服务器的所有实例上备份所有数据库的 TSQL 解决方案?

我很确定我想要的当前实现是不可能的,sys.databases 目录视图在服务级别范围内可以了解其他 SQL Server 实例 (lol)。但我认为很多事情用电脑是不可能的,所以希望我能用不同的方式解决我的问题。

我已经创建了一个 PowerShell 解决方案,该解决方案使用 SMO 来备份所有实例上的所有数据库,但是由于安全原因,我无法在不将运行代理作业的代理帐户设为本地管理员的情况下使该解决方案工作服务器。

作为替代方案,我编写了一个 T-SQL 脚本,该脚本将作为代理作业运行,并每 15 分钟对 SQL Server 实例中的所有数据库进行完整、差异或事务备份。

    DECLARE @sql nvarchar(MAX) = N'';

--Check time for full backup
IF (DATENAME(weekday,getdate()) = 'Sunday' AND convert(time,getdate()) > '00:00' and convert(time,getdate()) < '00:15')
    BEGIN
        SELECT @sql += 'BACKUP DATABASE ' + QUOTENAME(name) 
                    + ' TO DISK = N''C:\backups\' + @@ServiceName  + '_' + name + '__' 
                    + cast(year(getdate()) as nvarchar(4)) + '_' + cast(month(getdate()) as nvarchar(2)) + '_' + cast(day(getdate()) as nvarchar(2)) …
Run Code Online (Sandbox Code Playgroud)

sql-server backup instance t-sql smo

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

SQL Server 在 XML 字段中选择

我需要以下情况的帮助:

在我的表 SQLServer 2012 中有一个带有 xml 值的字段,我想选择该字段中的数据并在表单列中显示结果。

图片1

<row> 
  <ID_Cota>162986</ID_Cota>
  <ID_Taxa_Plano>1000</ID_Taxa_Plano>
  <ID_Plano_Venda>1020</ID_Plano_Venda>
  <ID_Pessoa>18522</ID_Pessoa>
</row>
Run Code Online (Sandbox Code Playgroud)

谢谢你。

xml sql-server sql-server-2012 sql-server-2014

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