想象一下,我有一个模式,其中包括Products,Orders,和OrderLineItems,与Products作为一个系统版本态表。
架构:
CREATE TABLE dbo.Products
(
ProductID INT NOT NULL IDENTITY PRIMARY KEY,
Name nvarchar(255) not null,
SysStart DATETIME2 (7) GENERATED ALWAYS AS ROW START NOT NULL,
SysEnd DATETIME2 (7) GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd])
)
WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE = dbo.Products_History, DATA_CONSISTENCY_CHECK = ON));
GO
CREATE TABLE dbo.Orders
(
OrderID int not null identity primary key,
OrderDate datetime2 (7) not null
);
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 我有一个 SQL Server 2016 SP1,其中包含我准备与合作伙伴(开发人员)共享的数据,但有几列除外,例如:
email varchar(64) MASKED WITH (FUNCTION = 'email()') NULL
Run Code Online (Sandbox Code Playgroud)
我向合作伙伴提供了以特定用户身份登录数据库测试副本的凭据,而无需取消屏蔽权限。我知道这是相当安全的。现在,我们正在考虑与我们的合作伙伴共享数据库备份,以便他们可以在自己的服务器和环境中重新加载。
我可能需要包含用户,以便合作伙伴无法创建新用户或将他们连接到现有登录名(对此不确定)。
CREATE USER user_name WITH PASSWORD = 'strong_password';
Run Code Online (Sandbox Code Playgroud)
有没有办法可以共享数据库备份,并且仍然相信被屏蔽的列是安全的,或者我是否必须物理删除数据?
我知道 SQL Server 2016 让我们使用 SYSTEM_VERSIONING 像:
CREATE TABLE EmpSalary
(
EmpID int NOT NULL PRIMARY KEY CLUSTERED
, SalaryAmt decimal (10,2) NULL
, SalaryBeginDT datetime2 GENERATED ALWAYS AS ROW START NOT NULL
, SalaryEndDT datetime2 GENERATED ALWAYS AS ROW END NOT NULL
, PERIOD FOR SYSTEM_TIME (SalaryBeginDT, SalaryEndDT)
)
WITH (SYSTEM_VERSIONING = ON);
Run Code Online (Sandbox Code Playgroud)
同样要停用此功能,只需更改表:
ALTER TABLE EmpSalary SET (SYSTEM_VERSIONING = OFF );
Run Code Online (Sandbox Code Playgroud)
我的问题是如何检查表的 SYSTEM_VERSIONING 是否打开,然后更改表?
在开发解决方案的原型时,通常还没有确定技术,并且可能与最终产品中使用的技术不同。
在这种情况下,我倾向于使用 Microsoft SQL Server 编写尽可能标准的查询,以简化最终迁移到另一台服务器的过程。
是否有一种方法或一些已知的做法可以直接在 SQL Server 中或通过SQL Server Management Studio (SSMS)强制使用标准 SQL over T-SQL 方言?
我正在寻找一些帮助。我有一个针对相当大的表(200 万条记录)运行的查询。
我一直在努力让索引有效地工作。还有一些针对此表的其他查询,但这是迄今为止最常见的查询。我很难让它在 1 秒内执行,并且经常看到它使用分析器在 3 到 5 秒内运行。
它可能会尽可能快,但我希望得到一些输入来确认/拒绝。
请注意:开发人员根本不会更改查询或架构。只能在数据库中进行优化,不能更改架构。
桌子:
CREATE TABLE [dbo].[Notifications](
[ntID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[NotificationID] [int] NOT NULL,
[NotificationType] [nvarchar](50) NOT NULL,
[UserName] [nvarchar](50) NULL,
[CreatedBy] [nvarchar](50) NULL,
[CreatedOn] [datetime] NULL,
[Status] [nvarchar](50) NOT NULL,
[Result] [nvarchar](50) NULL,
[Extension] [nvarchar](50) NULL,
[ShiftRate] [nvarchar](255) NULL,
[ResponseMinutes] [int] NULL,
[ResponseWindow] [datetime] NULL,
[caNotificationID] [int] NULL,
[AwardedBy] [nvarchar](50) NULL,
[AwardedOn] [datetime] NULL,
[CancelledBy] [nvarchar](50) NULL,
[CancelledOn] [datetime] NULL,
[CancelledReasonID] [int] NULL,
[CancelledReasonText] [nvarchar](255) NULL, …Run Code Online (Sandbox Code Playgroud) index sql-server index-tuning nonclustered-index sql-server-2016
我认为这是一个权限问题,但我无法找到它。
我在一台服务器(SQL Server 2016)上有一组 CLR,它们可以正常工作。所有这些都被标记为 UNSAFE,并且它们执行各种类型的文件 I/O(读取、写入、复制、移动、重命名等)。我可以通过 SSMS 或同样轻松地从工作中运行它们。
我需要将它们安装在另一台服务器(也是 SQL Server 2016)上。使用原始的 Visual Studio 项目,我已将它们部署到新服务器。它们出现在 SSMS 中。那部分看起来不错。
当我从 SSMS 尝试运行一个时,我收到以下错误:“拒绝访问路径‘我传入的任何路径’。”
我在 Windows 登录下登录到 SSMS。我有数据库的权限,我是 dbo。我是服务器管理员。我在文件系统中有权限。
我还能缺少什么?
用于预订事物的事务性数据库...
我们的供应商被要求用@tablevariables 替换#temptables(因为编译锁很重),但他们用一个实际的表来替换,该表将SPID 添加为一列,以确保存储过程只作用于适用的行。
您认为这种操作方法有什么风险吗?在所有事务都被隔离在他们自己的事务中之前......我担心我们最终可能会锁定这个表,但他们的意见是 SQL 使用行级锁定,这不会创建更多的锁。
SQL Server 版本:2016 企业版 - 13.0.5216.0
CREATE TABLE dbo.qryTransactions (
ID int IDENTITY (0,1) NOT NULL CONSTRAINT pk_qryTransactions PRIMARY KEY CLUSTERED,
spid int NOT NULL,
OrderID int,
ItemID int,
TimeTransactionStart datetime,
TimeTransactionEnd datetime,
...other fields
)
CREATE INDEX idx_qryTransactions_spidID ON qryTransactions (spid, ID) INCLUDE (ItemID, OrderID, TimeTransactionStart, TimeTransactionEnd)
Run Code Online (Sandbox Code Playgroud) sql-server stored-procedures sql-server-2016 enterprise-edition table-variable
在 SQL Server Always On Availability Group™ 的主要/次要副本上运行以下查询时
SELECT DISTINCT local_tcp_port,protocol_type,num_reads,num_writes
FROM sys.dm_exec_connections
WHERE local_net_address is not null;
Run Code Online (Sandbox Code Playgroud)
为数据库镜像协议显示了两个本地 tcp 端口,5022&63420
Server Name local_tcp_port protocol_type num_reads num_writes
ServerName 5022 Database Mirroring 102942598 5
ServerName 63420 Database Mirroring 5 89655349
Run Code Online (Sandbox Code Playgroud)
该5022端口是预期的,因为这是配置为镜像端点的端口。
另一个似乎是一个动态端口,为什么使用这个端口以及用于什么?
是否与一个显示大量读取 ( 5022) 和另一个显示大量写入 ( 63420)的事实有关。
构建版本:13.0.5264.1
我有一个奇怪的安全问题。我有一个用户在 SQL 2016 服务器上使用 SSMS 18.2。他们是 db_datareader 的成员,但是当他们在 Object Explorer Details 中拉出Row Count列时,它是空白的。尽我所知,它需要 DBO 才能显示行数。
这是一个错误还是故意的?有谁知道是否有较低级别的权限可以提供此行数?我知道有很多其他方法可以获得行数,例如sys.partitions,但是用户坚持认为他们想要使用 OED 窗口。
我有一个包含大量数据(近 1500 万)且结构如下的表。
create table test
(a int,--> /* There is a normal index on this column */
b int,
<other columns>)
Run Code Online (Sandbox Code Playgroud)
有一个从此表中进行选择的查询,其中 where 子句中的条件之一是:
where a!=1 or (a=1 and b!=0) /* The original condition */
Run Code Online (Sandbox Code Playgroud)
查询非常慢,我认为这种糟糕的性能大部分可能是由于逻辑运算符使用不当造成的。我已经改变了条件,如下所示:
where not (a=1 and b=0) /* The edited version*/
Run Code Online (Sandbox Code Playgroud)
并且性能发生了巨大的变化!我需要确定的是这两个条件完全相同,这样我就不会错过任何数据。我想知道您是否可以帮助我解决这个问题并告诉我您是否有更好的选择来治疗这种情况。
如果您知道任何有关逻辑运算的正确使用以及/顺序优化器处理它们的方式的文章,请分享链接。
提前致谢
sql-server ×10
sql-server-2016 ×10
permissions ×2
backup ×1
ddl ×1
files ×1
index ×1
index-tuning ×1
migration ×1
query ×1
sql-clr ×1
sql-standard ×1
ssms ×1
t-sql ×1