看起来Enterprise Manager*生成的一些脚本(或者没有,它们无关紧要)创建了检查约束WITH NOCHECK.
现在,当任何人修改表时,SQL Server都会遇到失败的检查约束,并抛出错误.
我可以让SQL通过它的所有检查约束,并检查它们吗?
运行:
sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
Run Code Online (Sandbox Code Playgroud)
只启用以前禁用的检查约束,它实际上不会检查它们.
*SQL Server 2000
sql-server sql-server-2000 database-integrity check-constraints sp-msforeachtable
我有一个名为table的表patient_address,它在patient表中引用了一个PK键.但是,如果我尝试运行以下语句之一:
update patient set id_no='7008255601088' where id_no='8008255601088'
update patient_address set id_no='7008255601088' where id_no='8008255601088'
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
"UPDATE语句与REFERENCE约束冲突"FK__patient_a__id_no__27C3E46E".冲突发生在数据库"PMS",表"dbo.patient_address",列'id_no'." 或"UPDATE语句与FOREIGN KEY约束冲突"FK__patient_a__id_no__27C3E46E".冲突发生在数据库"PMS",表"dbo.patient",列'id_no'." .
有没有人知道可能的原因?谢谢.
我试图在Visual Studio 2013/15中使用SQL模式比较,并且遇到了从删除表中删除表的问题,使它们完全无法处理.
问题是它试图删除的表是客户制造的表,所以当我们将我们的版本与他们的数据库同步时,它要求删除它们.我们不想删除它们,但是它们的一些表对我们的表有约束,因此当它尝试CCDR时由于表约束而失败.有没有办法添加表(重新创建?像其他人一样?),而不是为每个客户端编写脚本来执行SQL Schema Compare已经为这几个表做的事情?
Red-Gate的SQL Compare以某种方式做到这一点,但它对我们隐藏,所以不太确定它是如何实现的.删除不删除,但脚本上也没有错误.
更新:
"删除不在源中的约束"选项似乎无法正常工作.它确实会丢掉一些,但是还有一些它不会放弃约束.在red-gate的工具中,当我们比较时,我发现了如何从中获取SQL,而他们的产品并没有说表需要根据需要进行更新,而Visual Studio则可以.它们似乎工作几乎相同,但失败的表是根本不应更新的表(见下文)
更新2:
我发现的另一个问题是"忽略列排序规则"也不能正常工作,因为这不应该被越来越下降被告知,他们需要的,即使它只是一个列变化,而不是实际的列或数据才能被更新的表变化,这使得这更像是一个错误报告而不是任何东西.
如何使用T-SQL删除SQL Server 2000中的表上的所有外键约束?
我有一个巨大的遗留数据库,其中一个表有多个外键指向另一个表,并且看不到一个级联,类似于下面的示例表:
create table Users (
Id int primary key identity,
Name varchar(max)
)
create table Products (
Id int primary key identity,
Name varchar(max),
CreatedBy int foreign key references Users(Id),
UpdatedBy int foreign key references Users(Id)
)
insert into Users values('Bar')
insert into Users values('Baz')
insert into Products values('Foo', 1, 2)
Run Code Online (Sandbox Code Playgroud)
我需要能够删除一些旧数据,但它当然会引发引用异常:
delete from Users where Name='Bar'
Run Code Online (Sandbox Code Playgroud)
DELETE 语句与 REFERENCE 约束“FK__Products__Create__1AD3FDA4”冲突。冲突发生在数据库“Foo”、表“dbo.Products”、“CreatedBy”列中。
由于数据库的绝对复杂性,我无法预先删除所有引用,因此我尝试通过级联设置以编程方式添加临时外键以解决它们。但是,对于这个具有多个指向另一个表的外键的特定表,这会导致cycles or multiple cascade paths第二个UpdatedBy更改:
alter table Products add foreign key (CreatedBy) references Users(Id) on …Run Code Online (Sandbox Code Playgroud) 我正在编写一个代码来将MySQL数据库备份到二进制文件中.我知道mysqldump但由于某些原因我不能使用琐碎的方法.我目前在做什么:
依赖关系的定义:当且仅当指向密钥时至少有一个外键时,表T1依赖于表的存在.T2T1T2
为每个表分配一个数值.此值指定表的顺序.对于没有依赖关系的表,此值0对于其他表来说是当前表依赖于它们的表的最大值; 加一.如果-1依赖表的值集合中有一个,则当前表的值仍为undefined(-1).最初所有表的值都是-1未指定的.
这是C++代码:
// tablesQueue: Queue of all tables
// orderedQueue: Resulting order
while(! tablesQueue.isEmpty())
{
bool satisfied = true;
foreach(TableNode* parent, tablesQueue.head()->referencedTables)
{
if(parent->degreeOfFreedom == -1)
{
satisfied = false;
break;
}
else
// handle error blah blah ...
}
if(satisfied)
{
int max =0;
foreach(TableNode* parent, tablesQueue.head()->referencedTables)
max = (max < parent->degreeOfFreedom+1) ?
parent->degreeOfFreedom+1 : max;
tablesQueue.head()->degreeOfFreedom = …Run Code Online (Sandbox Code Playgroud) 插入和修改大量数据可能需要它.
说实话,我在输入问题时已经知道了答案.但是我找到它真的很难,所以我想,这个答案对其他人来说会有所帮助.
但如果你知道更好的方法,你可以自由回答.
来源:http://www.nxtbook.com/nxtbooks/cmp/msdnmag0407/index.php?startid = 27
__PRE__
来源:http://www.nxtbook.com/nxtbooks/cmp/msdnmag0407/index.php?startid = 28
__PRE__