我有一个articles引用categories表的表。我像这样定义外键:
constraint fk_categoryid foreign key (categoryid) references categories (categoryid)
on update no action
on delete no action
Run Code Online (Sandbox Code Playgroud)
是否可以在外键定义中限制可以基于categories表中另一列引用的类别?例如,假设表中有一个hasarticles列categories。我希望将外键约束限制在hasarticles = true.
我有两个 SQL Server 之间的事务复制。出于测试目的,我在订阅者处删除了许多仍然存在于发布者处的记录。
我现在知道,如果有人在发布者处更新或删除了我的订阅者上不存在的一些记录,那么我的复制将会崩溃。
我知道我也可以在分发服务器上过滤数据,但这意味着重新初始化我的订阅者,这意味着通过慢速链接传输近 40GB。
因此,当我测试我订阅的数据库时,我希望限制用户只能在发布者端更新或删除记录。我的源表有一个日期字段,我想根据日期限制更新或删除。
为此使用触发器还是约束更好?
如何尽可能避免记录锁定?
有没有办法显示所有表格的布局以查看它们的列?我正在尝试查找具有特定列名的表。
我正在使用 Web 应用程序Web Data Administrator
例子:
table1
- column 1
- column 2
table2
- column 1
Run Code Online (Sandbox Code Playgroud)
有没有办法获得这样的显示?
在我的测试网络中,有一个用 SQL Server 2005 创建的数据库。我必须将 SQL Server 2005 更新为 SQL Server 2008。该数据库应该与 SQL Server 2008 一起使用。所以要移动它。在 SQL Server 更新期间/之后传输数据库的最佳方法是什么?
数据库没有响应简单的选择语句,如
select * from table
Run Code Online (Sandbox Code Playgroud)
我注意到sys.dm_os_waiting_tasks一个会话被阻塞,阻塞会话指向一个使用 lock & Tran 的存储过程,如下所示
BEGIN TRAN
declare @min numeric ,@com numeric
select top 1 @com=companyid from tblcompanies
order by newid()
select @min=min(productid) from tblproducts(UPDLOCK)
where companyid=@com and (lockstatus<>1 or lockstatus is null )
update tblproducts
set lockStatus='1'
where productid>=@min and productid<@min+4
select distinct top 4 s.productname,s.productid,s.companyid,r.Type,r.requestType,r.UserID
from tblcompanydetail rd inner join tblproducts s
on rd.productid=s.productid
inner join tblcompanies r
on r.companyid=s.companyid
where s.productid>=@min and s.productid<@min+4
if @@error >0 rollback tran
commit tran …Run Code Online (Sandbox Code Playgroud) 我仍在努力理解 SQL 的备份作业。
我们目前有一个使用完整恢复模型的 SQL Server 2005 实例。
我们每周进行一次完整的数据库备份。
BACKUP DATABASE [MyDatabase]
TO DISK = N'E:\Database Backups\MyDatabase.Bak'
WITH INIT, NAME = N'MyDatabase.Bak'
Run Code Online (Sandbox Code Playgroud)
每天一次差异备份
BACKUP DATABASE [MyDatabase]
TO DISK = N'E:\Database Backups\MyDatabase_Diff.Bak'
WITH INIT, DIFFERENTIAL, NAME = N'MyDatabase_Diff.Bak'
Run Code Online (Sandbox Code Playgroud)
现在我试图弄清楚如何每小时安排事务日志备份,所以我们最多会损失一个小时的工作。
BACKUP LOG [MyDatabase]
TO DISK = N'E:\Database Backups\MyDatabase_Log.Bak'
Run Code Online (Sandbox Code Playgroud)
我的问题是,我们的存储空间有限,我不希望日志文件变得太大。我可以使用WITH INIT事务日志备份来强制它每小时创建一个新文件吗?或者我是否需要自上次差异备份以来的所有事务日志备份才能恢复到一天中的特定时间点?
如果我确实需要保留自上次差异以来的所有副本,有没有办法在我进行备份时告诉它重置?
所以我有两个表会造成死锁。应用程序实际上什么都不做,只是在两个不同的事务中更新两个不同的表。这两个表之间存在外键约束(不是级联,只是为了强制完整性),否则就每个事务的发生方式而言,两者之间没有关系。这可能是僵局的全部根源吗?如果是这样,你如何设计外键约束来避免这个问题?
更新:我应该指出(对于那些遇到这个问题的人)根本问题最终与外键约束无关,但是根据这一点,如果另一个外键约束可能导致死锁side 只有主键的聚集索引。
我还了解到死锁 XML 报告没有捕获到那时的整个事务(我错误的假设它确实导致了不正确的问题),这很烦人。
编辑:这两个表是一个名为 KID 的表和一个名为 Image 的表(还有 ZAT_KID 和 ZAT_Image 由触发器填充作为审计跟踪,它们不引用其他任何内容)。Image 的 KIDID 字段是 KIDID 的 KID 主键(聚集索引)的外键。我还应该补充一点,每个堆栈开头的初始选择 1 是数据库池,确保连接在执行其他任何操作之前仍然有效。
这是死锁 XML:
<deadlock-list>
<deadlock victim="processedb6d8">
<process-list>
<process id="processec49b8" taskpriority="0" logused="2672" waitresource="PAGE: 7:1:295182" waittime="2609" ownerId="2771483341" transactionname="implicit_transaction" lasttranstarted="2013-02-05T15:32:48.150" XDES="0x804da410" lockMode="X" schedulerid="2" kpid="10180" status="suspended" spid="93" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2013-02-05T15:32:56.980" lastbatchcompleted="2013-02-05T15:32:56.963" clientapp="Microsoft JDBC Driver for SQL Server" hostname="newappserver" hostpid="0" loginname="DatabaseUser" isolationlevel="read committed (2)" xactid="2771483341" currentdb="7" lockTimeout="4294967295" clientoption1="539099168" clientoption2="128058">
<executionStack>
<frame procname="Database.dbo.T_Audit_KID" line="67" stmtstart="3936" stmtend="5062" sqlhandle="0x030007005776f42cc93b87015aa100000000000000000000">
INSERT INTO …Run Code Online (Sandbox Code Playgroud) 我有一个包含 varchar 类型字段中的 XML 数据的表。该字段用于存储来自各种不同 XML 模式的数据,其中一些通过存储在另一个表中的记录相关联。
我最近创建了一些解析 XML 的视图,并且在某些情况下创建了一些值的枢轴。这些视图为我的报告提供了极好的数据,但对性能造成了严重影响。我想知道是否可以通过索引提高性能。
下面是一个视图的例子:
create view StudentHours as
select
x.TableRecordId as Id
, x.RecordXml.value('(/TableRecord/LOGDate)[1]', 'DateTime') as LogDate
, x.RecordXml.value('(/TableRecord/LOGHours)[1]', 'float') as Hours
, x.RecordXml.value('(/TableRecord/LOGApproved)[1]', 'varchar(10)') as Approved
, y.PKTableRecordId as CourseId
from
(select TableRecordId, Cast([Schema] as Xml) as RecordXml
from TableRecords where TableSchemaId = 1857) as x
join TableRecordRelations as y on x.TableRecordId = y.FKTableRecordId
Run Code Online (Sandbox Code Playgroud)
然后,我将在其他执行聚合等操作的视图中使用此视图。
名为 TableRecords 的表在其唯一 id TableRecordId 上有一个索引,TableRecordRelations 在其重要字段上也有索引。
添加一两个索引是否有助于此视图的性能?是否需要更多数据来确定这一点?
我们正在将 SQL Server 2005 数据库迁移到新服务器并升级到 2008,我正在寻找一些建议和保证我们的方法是正确的。
我继承了这个数据库,但说实话,我发现它有点混乱 - 最重要的是,我基本上已经学会了在这台服务器上成为一名 SQL Server 开发人员(没有计算方面的教育背景),所以我做了很多我自己的错误。我们作为一个部门(公共部门)资金不足,因此缺乏专业知识,只能靠自己的力量自力更生。数据库一开始只是一个后台的东西,但对我们的组织来说已经变得非常重要,因此坦率地说,性能令人尴尬。
所以我们有这样的问题
text到处都是不合适的数据类型(很多Nvarchar, nchar,ntext当我们不需要 ascii 字符时,text哪里varchar更合适)新服务器是 64 位虚拟服务器,存储在 RAID 上。
我安装和升级后的计划是:
text数据类型规范化为varchar/char在这些流程之后/之前,我还有什么应该考虑的吗?这里的任何决定是否看起来不合时宜?例如文件大小问题 - 这是我在 RAID 上需要担心的事情吗?
目前正在研究重新索引我们的 sql 数据库,但找不到有关过程缓存是否会受到影响的任何信息。任何帮助或信息都会很棒。我们使用 SQL Server 2005 作为我们的 DBMS。
sql-server-2005 ×10
sql-server ×4
foreign-key ×2
backup ×1
cache ×1
constraint ×1
deadlock ×1
migration ×1
replication ×1
trigger ×1
upgrade ×1
view ×1
windows ×1