WEB开发网
开发学院数据库MSSQL Server 带你深入了解T-SQL的十一种设计模式 阅读

带你深入了解T-SQL的十一种设计模式

 2008-09-04 10:00:41 来源:WEB开发网   
核心提示: 3、复制表时指定新数据 select IDENTITY(int,1,1) AS CustNo,*INTO newCustomersFROM Customers注:还可指定新列、通过联接选取来自其他表或视图的列、约束或函数等许多的可能性, 八、Singleton(单例) 此模式目标:确保在任

3、复制表时指定新数据

select IDENTITY(int,1,1) AS CustNo,*
INTO newCustomers
FROM Customers

注:还可指定新列、通过联接选取来自其他表或视图的列、约束或函数等许多的可能性。

八、Singleton(单例)

此模式目标:确保在任何给定时间只存在一个类实例并且提供访问该实例的路径。

严格说,在关系数据库中,对于面向对象类的等价物是表。类的一个实例就是表中的一行。因此,Singleton模式的最显而意见的实现就是确保表中只包含一行。

  create TABLE LastCustNo
(LastCustNo int)
GO
  insert LastCustNo VALUES(1)
GO
  create TRIGGER LastCustNoinsert ON LastCustNo
FOR insert
AS
IF (select count(*) FROM LastCustNo) > 1
BEGIN
RAISERROR(’You May Not insert more than one row into this table!’,16,10)
ROLLBACK TRAN
END
GO
  insert LastCustNo VALUES(2) --由于触发器的原因,插入失败
GO
select * FROM LastCustNo

注:由于触发器的原因,在任何时刻只允许在表中插入一行,如果表中已包含至少一行,在试图插入新的一行时将导致错误并回滚事务。

(1)IF (select count(*) FROM LastCustNo)必须用 > 1 ,而不能用=1,因为除Instead Of触发器外,T-SQL触发器只在操作已完成,但还没提交给数据库前运行,这表明从触发器角度看,在事务回滚前,LastCustNo表看起来总是包含两行。

(2)禁止使用IF exists(select count(*) FROM LastCustNo)测试表中的行,因对于触发器来说,新插入的行直到事务被回滚才出现在表中,因此,即使在插入前表为空,也将禁止向表中插入行。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:深入 了解 SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接