小编Aar*_*and的帖子

检查约束引用同一表中的另一列

我有这个表,但检查约束给我一个错误:

列 'MedicamentRegulated' 的列 CHECK 约束引用另一列,表 'Medicaments'。

我已经看到这在 SQL Server 中是允许的,但我不知道为什么它不起作用:/

CREATE TABLE Medicaments (
MedicamentID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Name VARCHAR(50),
DateValidity DATE,
MedicamentRegulated BIT CHECK((MedicamentRegulated = 1 AND DateValidity IS NOT NULL) 
  OR MedicamentRegulated = 0)
)
Run Code Online (Sandbox Code Playgroud)

sql-server constraint ddl check-constraints

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

如何仅从周末拉行?

我的表数据是这样的:

ID   Name salary   date
1     a    100     1/08/2014
2     b    200     2/08/2014
.
.
.
.
26     z   2600    26/8/2014
Run Code Online (Sandbox Code Playgroud)

现在我只想返回周六或周日的行,例如:

ID   Name salary   date
2    ------------------------
3     -----------------------
9
10
16
17
23
24
30
31 -------------------------
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql

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

为什么从脚本中删除所有外键不起作用?

我在 SQL Server 2008 R2 机器上拥有系统管理员权限。我找到了一个脚本,它可以删除所有外键,并在测试导入后需要时为我们重新添加它们。因此,我执行以下代码时没有语法错误,因为它显示了“Alter Table [ParentTable] Drop Constraint FK_Name”...总共 23 个键,但是当我刷新服务器或数据库和表时,当我为每个表展开 Keys 节点时,我仍然看到它们吗?那么为什么不丢弃它们呢?另外,如果我想再次运行以进行测试,我是否需要将其转换为永久表或将脚本放入存储过程中?请指教。

我使用了“Pinal Dave”发布的“Swastik Mishra”中的以下脚本 http://blog.sqlauthority.com/2014/04/11/sql-server-drop-all-the-foreign-key-constraint-in- database-create-all-the-foreign-key-constraint-in-database/

    SET NOCOUNT ON
DECLARE @table TABLE(
RowId INT PRIMARY KEY IDENTITY(1, 1),
ForeignKeyConstraintName NVARCHAR(200),
ForeignKeyConstraintTableSchema NVARCHAR(200),
ForeignKeyConstraintTableName NVARCHAR(200),
ForeignKeyConstraintColumnName NVARCHAR(200),
PrimaryKeyConstraintName NVARCHAR(200),
PrimaryKeyConstraintTableSchema NVARCHAR(200),
PrimaryKeyConstraintTableName NVARCHAR(200),
PrimaryKeyConstraintColumnName NVARCHAR(200)
)
INSERT INTO @table(ForeignKeyConstraintName, ForeignKeyConstraintTableSchema,     ForeignKeyConstraintTableName, ForeignKeyConstraintColumnName)
SELECT
U.CONSTRAINT_NAME,
U.TABLE_SCHEMA,
U.TABLE_NAME,
U.COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE U
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS C
ON U.CONSTRAINT_NAME = C.CONSTRAINT_NAME
WHERE
C.CONSTRAINT_TYPE = 'FOREIGN KEY'
UPDATE @table SET
PrimaryKeyConstraintName …
Run Code Online (Sandbox Code Playgroud)

foreign-key sql-server metadata sql-server-2008-r2 alter-table

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

还原的数据库与原始数据库不同

我最近将我们的数据仓库临时数据库还原到我们开发环境中的一个单独实例上。恢复后我做了一个比较,看起来数据库大小不同。Staging_Original 为 8246 MB,而 Staging_New 为 7571.63 MB。新数据库中的 2 个表似乎丢失了,并且由于某种原因,新数据库中有一个旧数据库中不存在的表。如果我执行了完整备份和还原,这怎么可能?如何获取一个数据库的精确副本并将其还原到第二个实例中?两个模型数据库似乎也相同。

备份脚本:

BACKUP DATABASE [BI_Staging] TO  DISK = N'G:\BI_Staging.bak' 
  WITH NOFORMAT, NOINIT,  NAME = N'BI_Staging-Full Database Backup', 
  SKIP, NOREWIND, NOUNLOAD,  STATS = 10, CHECKSUM
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset 
  where database_name=N'BI_Staging' 
  and backup_set_id=(select max(backup_set_id) 
    from msdb..backupset where database_name=N'BI_Staging' )
if @backupSetId is null 
begin 
  raiserror(N'Verify failed. Backup information for database ''BI_Staging'' not found.', 16, 1) 
end
RESTORE VERIFYONLY FROM  DISK = N'G:\BI_Staging.bak' 
  WITH FILE = …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2

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

有没有更快的方法在 Postgres 中获得 UNION ALL 行为?

我的 Postgres 数据库中有一个表 (t0),其中的数据如下所示:

t1_id  t2_id
1      1      
2      1
2      1
4      null
4      null
5      null
Run Code Online (Sandbox Code Playgroud)

我有一个查询要返回我想要的结果:

t1_id  t2_id
1      1
4      null
5      null
Run Code Online (Sandbox Code Playgroud)

我的查询看起来像这样:

(
  SELECT DISTINCT ON (t2_id) t1_id, t2_id
  FROM t0
  WHERE t2_id IS NOT NULL
)
UNION ALL
(
  SELECT DISTINCT ON (t1_id) t1_id, t2_id
  FROM t0
  WHERE t2_id IS NULL
)
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来执行这样的操作?这还不错,但是我在几个地方(使用连接)这样做,所有这些重复的查询似乎都会减慢速度。看来必须有更好的办法了。

这是小提琴形式的查询:http://sqlfiddle.com/#!15 /d41d8/3603

postgresql performance union

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

如何识别调用存储过程的程序?

作为应用程序数据库设计规范的一部分,我们被要求阻止执行一组直接从 SSMS/osql/sqlcmd 等触发的存储过程;也就是说,它们必须只被允许在应用程序本身内运行。

当我们的团队质疑这是否可行时,我们看到了一个演示,该演示将查询限制在特定系统(实际上它让查询运行,但记录到运行它的表中)。然而,这样做的过程是加密的,所以我们无法知道它是如何完成的。

我们如何做到这一点?

security sql-server stored-procedures sql-server-2014

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

当另一半失败时,交易的一半完成?

我在 SO、MSDN 和其他各种来源上进行了一些搜索,发现了很多关于事务的问题,但似乎没有一个正是我正在处理的问题。

诚然,尽管我确实了解 ACID 和事务的概念,但我仍然是初级 DBA。我正在处理一个 SQL 脚本:

  1. 向 2 个不同的表添加一行,前提是这些值尚不存在
  2. 如果存在,则删除列
  3. 如果不存在则添加一列
  4. 更改 2 个生成动态 SQL 以构建报表查询的存储过程

上述所有操作都是独立工作的,并且在(我认为是)单个事务中包含时,它们也会协同工作。我试图理解的是,当事务的另一部分失败时,事务的“部分”如何完成(并可能提交)。

为简洁起见,假设我有名为“ProcessReport”和“RetrieveReport”的工作程序。这两个过程中的动态 SQL 都以“SELECT”开头,然后从那里开始构建。测试用例:

CREATE TABLE ReportTable (FirstName VARCHAR(100), LastName VARCHAR(100), OrderId INT);
GO
CREATE PROCEDURE ProcessReport
AS
BEGIN
  DECLARE @SQL VARCHAR(4000)

  -- start creating dynamic sql   
  SET @SQL = 'SELECT FirstName, LastName, '
  --create rest of dynamic SQL here...

  INSERT INTO ReportTable (FirstName, LastName) EXEC(@SQL)
END
GO 

CREATE PROCEDURE RetrieveReport
AS
BEGIN
  DECLARE @SQL VARCHAR(4000)

  -- start creating dynamic sql …
Run Code Online (Sandbox Code Playgroud)

t-sql transaction sql-server-2012 acid

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

辅助副本索引

我有一个问题,关于一个问题,它是 70-462 Microsoft 考试的一部分。

我今天有这个问题,我不完全确定正确答案。虽然我确实通过了考试,但我想了解这种情况下的正确解决方案。

如果我没记错问题,您管理的是 2012 SQL Server,要求是将 OLTP 数据库的分钟报告卸载到另一台服务器,并且还能够向辅助数据库添加索引。

问题的答案大致如下:

  1. 两台服务器,不同的数据中心。具有同步提交的 AG 组。主动次要。
  2. 两台服务器,同一个子网。具有同步提交的 AG 组。
  3. 两台服务器,每 10 分钟发送一次日志。
  4. a-synch 提交有几个不同的答案。
  5. 包含配置为执行事务复制的应用程序数据库的 SQL Server。
  6. 包含配置为执行快照复制的应用程序数据库的 SQL Server。
  7. Windows 故障转移群集中的两台服务器。SQL Server 配置为群集实例。

最初我排除了异步提交选项(延迟)、不同数据中心的同步提交 AG 组(延迟?)、日志传送(延迟)和快照复制选项。

这给我留下了同一个子网上的同步提交 AG 组,或具有事务复制的 SQL 服务器。

基于https://msdn.microsoft.com/en-us/library/ff878253.aspx,我读到如果你想在你的活动辅助节点上建立索引,你必须在你的主要节点中创建它们。我将这个问题解释为要求能够在主服务器上创建索引,而这些索引在主服务器上不存在(包括用于报告的索引,或者其他什么不存在)。

另一个答案,单独指的是 SQL Server,这听起来不像我们要添加“另一台服务器”来卸载工作。

我是否误解了问题/要求?正确答案/解决方案应该是什么?

replication sql-server sql-server-2012 availability-groups

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

查找数据重置的行

所以我有一个表tbl,我试图在其中提取以可变速率递增的数据。我需要确定数据何时重置,以便我可以得出一个累积值。这是一个示例表:

ID    VAL
 1     12
 2      2
 3     14
 4     20
 5     24
 6     25
 7      2
 8     11
 9     14
10     15
11     18
12      0
13      5
Run Code Online (Sandbox Code Playgroud)

如何在 SQL 查询中识别哪些行已重置数据?

在此表示例中,我想将行 ID 2、7 和 12 标识为数据重置的点。

最终结果是,我可以将第 1、6 和 11 行(以及其他数据)添加到当前值以获得总累积值。

sql-server sql-server-2012

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

INSERT/UPDATE 存储过程本身死锁

我有一个表 (Database2.dbo.OrganizerDataDependencyChange),其中包含有关某些其他表中的行上次更改时间的信息。在这些表中的每一个上,我都有一个触发器,它调用一个存储过程 (Database2.dbo.SaveOrganizerDataDependencyChange),该过程简单地用触发器触发的时间更新 Database2.dbo.OrganizerDataDependencyChange。这些触发器是从 Database1 或 Database2 触发的,因此它们通常是跨数据库调用。

当更新表上的两个不同行时,我在 Database1.dbo.OrganizerDataDependencyChange 表上遇到读写死锁,我不明白为什么。表上只有一个索引,而且它是完全覆盖查询的聚集索引,因此不可能出现查找死锁,尽管 proc 中有两条语句,但我特地将其重写为我所理解的最佳方法避免并发问题,使用 WHERE NOT EXISTS 而不是使用 IF/ELSE 逻辑,所以它不应该从不同的角度出现在这个索引上,对吗?由于它是在触发器和跨数据库中触发的,因此我在重现该问题时遇到了一些困难,我当然可以重现阻塞,但这应该没问题,这正是我所期望的。

有人可以帮助我了解这里发生了什么吗?我可能可以使用 NOLOCK 提示或 applock 修复它,但我仍然不明白为什么会发生这种情况。

这是表:

CREATE TABLE [dbo].[OrganizerDataDependencyChange](
[TableID] [INT] NOT NULL,
[Database] [VARCHAR](150) NOT NULL,
[Updated] [DATETIME] NULL
)
CREATE CLUSTERED INDEX [CX_OrganizerDataDependencyChange_TableID_DB] ON [dbo].[OrganizerDataDependencyChange]
(
[TableID] ASC,
[Database] ASC
)
Run Code Online (Sandbox Code Playgroud)

这是存储过程:

CREATE PROCEDURE [dbo].[SaveOrganizerDataDependencyChange]
(
@TableID int,
@Database varchar(150)
)
AS
BEGIN

SET NOCOUNT ON;

    DECLARE @rowcount INT;

INSERT INTO dbo.OrganizerDataDependencyChange
        ( TableID, [Database], Updated )
SELECT TOP …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock insert update sql-server-2014

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