我正在对 SQL Server 中的约束进行审计。
如何找到所有未启用的约束?
在使用下一个声明之后:
alter table mytable nocheck constraint all
Run Code Online (Sandbox Code Playgroud) 设想:
MY_TABLE有主键约束PK_MY_TABLEMY_TABLE还有一个名为的索引IDX_PK_MY_TABLE,用于强制约束的唯一性PK_MY_TABLE。如果我禁用约束PK_MY_TABLE然后重新启用它,索引IDX_PK_MY_TABLE会重建吗?
我将数据加载到数据仓库中。
目前,为了方便和速度,我有一个脚本,用于在加载数据之前删除外键约束和索引。有一个大窗口,我可以在其中进行加载,因此我不需要担心用户在加载期间访问数据,但我不想影响数据库中其他表中的无关数据。
我在这里和其他地方做了一些研究来提出这个脚本,但我想知道是否有一些我可能会忽略的事情可能会使性能欠佳,或者我可能会遗漏一些重要的东西(我不知道 . .. 计算列什么的?)或者我做事顺序错误等等。
任何建议都值得赞赏,以使其健壮和高性能。
禁用约束和索引
编辑:我删除了WHILE评论者帮助我意识到是多余的循环。
Declare @schema varchar(128) = 'dbo';
Declare @sql nvarchar(max) = N'';
-- 1. Indices
-- Select a list of indexes in the schema and generate statements to disable them.
Select @sql = @sql + 'ALTER INDEX ' + QuoteName(idx.name) + ' ON ' + QuoteName(@schema) + '.' + QuoteName(obj.name) + ' DISABLE;' + CHAR(13)
From sys.indexes As idx
Join sys.objects As obj On idx.object_id = obj.object_id …Run Code Online (Sandbox Code Playgroud) 我能够读取信息架构中的 CONSTRAINTS,但是如何获取与该 CONSTRAINTS 关联的所有参数,以使用 SQL 获取完整的 CONSTRAINTS 定义?例如,
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Run Code Online (Sandbox Code Playgroud)
这将为我提供约束列表,但是可以说,我有一个约束外键“user_role_id”,其完整定义(通过 pgAdmin)是
ALTER TABLE app.user
ADD CONSTRAINT user_role_id FOREIGN KEY (role_id)
REFERENCES app.role (id) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
那么,如何通过编写 SQL 来获得此定义,该 SQL 为我提供与该约束相关的所有选项呢?
我在 SQL Server 中遇到一个问题,其中非聚集索引查找的性能很差。
下面是实际的执行计划 https://www.brentozar.com/pastetheplan/?id=Sk3-4JGAK
我怎样才能提高绩效?
下面是表定义
CREATE TABLE [Parts].[ManufacturingData](
[LeadFinishId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[PartID] [int] NOT NULL,
[LeadFinishMaterial] [varchar](50) NULL,
[CreatedDate] [datetime] NULL,
[CreatedBy] [int] NULL,
[ModifiedDate] [datetime] NULL,
[Modifiedby] [int] NULL,
[DeletedDate] [datetime] NULL,
[DeletedBy] [int] NULL,
[Revision_Id] [int] NULL,
[BaseMaterialID] [int] NULL,
[MSLID] [int] NULL,
[MSLSource_Revision_id] [int] NULL,
[MaximumReflowTemperatureID] [int] NULL,
[ReflowTemperatureSource_Revision_Id] [int] NULL,
[MaximumWaveTemperatureID] [int] NULL,
[WaveTemperatureSource_Revision_ID] [int] NULL,
[ReflowSolderTimeID] [int] NULL,
[WaveSolderTimeID] [int] NULL,
[NumberOfReflowCycleID] [int] NULL,
[LeadFinishPlatingID] [int] NULL, …Run Code Online (Sandbox Code Playgroud) sql-server constraint stored-procedures execution-plan sql-server-2016
假设我有一个像 Users 这样的表,它有一个 id 和一个 company_id,我想创建一个第二个表,其中有一对用户 id 的 ex: (primary_key_id, user1_id, user2_id)。
这些用户对的用户 ID 必须位于同一公司。
如何向我的数据库添加约束以实现此要求?
我正在使用 SQL Server 2005,我需要创建一个带有字母字符和 3 个数字的主键:
p001
b201
Run Code Online (Sandbox Code Playgroud)
我知道我需要创建一个规则并将该规则绑定到主键列。我在使用LIKE查询创建规则时有点困惑:
CREATE RULE pK-rule AS @pk LIKE'[a-z][0-9][0-9][0-9]'
Run Code Online (Sandbox Code Playgroud)
有人可以建议我需要改变什么吗?
我们有一个包含以下列的 PriceCombo 表:id(非空)、a_id(空)、b_id(空)、c_id(空)、折扣(非空)。我们正在使用此表来确定分配各种商品组合的价格。
a_id = id of region
b_id = id of merchandize category
c_id = id of customer category
Run Code Online (Sandbox Code Playgroud)
所以基本上,我们总是知道 a、b 和 c,但我们有一个灵活的折扣方案,这样每笔销售都按照我们能找到的最具体的规则进行折扣。
我们的问题是我们无法防止数据库中的重复,例如,我们希望防止在 a_id、b_id 和 c_id 中具有相同值的两行
a_id=1, b_id=1, c_id=1 and
a_id=1, b_id=1, c_id=1
Run Code Online (Sandbox Code Playgroud)
不被允许和
a_id=1, b_id=1, c_id=null and
a_id=1, b_id=1, c_id=null
Run Code Online (Sandbox Code Playgroud)
不被允许,但
a_id=1, b_id=1, c_id=null and
a_id=1, b_id=null, c_id=null
Run Code Online (Sandbox Code Playgroud)
是允许的,因为这些在这 3 列方面不相同。
我在任何地方都没有找到关于如何创建唯一约束的答案,该约束既跨越多列又允许空值但不允许“相同”(至少在约束中指定的列方面)行
我正在为跟踪有关我公司的数据库开发项目的信息的应用程序设计数据库。项目管理办公室 (PMO) 根据项目的成本是否计入合并整合,为每个项目分配一个伪编号。举例来说,分配的数字将以INT(对于有助于合并整合的项目)或NINT(对于不有助于合并整合的项目)开头。然后分配一个序列号。例如,INT175将是第 175 个确定有助于合并整合的项目。另一个问题是 PMO 有时希望创建多个具有相同编号的项目,因为它们是“相关的”。因此,例如可能有一个 INT175 a项目、INT175 b项目等。
虽然 PMO 认为这个数字是项目的标识符,但在数据库中,我只会将该列用作备用唯一键,以确保不会创建重复的项目并作为用户的搜索键。我想对该列实施检查约束,以确保只能输入与我上面给出的规则匹配的有效数字。
我的第一个想法是使用正则表达式。在 Oracle 中,我的目标 DBMS,我们有可以使用的 REGEX_LIKE 函数。我研究了关于正则表达式的文档(这里、这里、这里、这里和这里),发现这些选项令人眼花缭乱!无论出于何种原因,我的大脑都在试图获取所有各种模式匹配选项的列表并将其应用到我的特定示例中。我是最擅长使用示例的人之一。不幸的是,我还没有找到很多例子。我发现的东西要么太简单,要么太复杂,我无法理解它们。
到目前为止我尝试过的是这样的:
select c
from (
select 'INT1756b' c from dual union all
select 'INT175a' c from dual union all
select 'INT75a' c from dual union all
select 'INT75' c from dual union all
select 'NINT2283a' c from dual union …Run Code Online (Sandbox Code Playgroud) constraint ×10
sql-server ×5
index ×2
alter-table ×1
dbms ×1
ddl ×1
foreign-key ×1
mysql ×1
oracle ×1
postgresql ×1
primary-key ×1
regex ×1