为了方便插入和更新,我们可以使用表格级别约束来确定一个修改被一个特殊的应用程序执行。为了删除表格,我们可以使用一个触发器。对这两种类型的约束,我们在更新数据中使用适当的应用程序来验证。
表格级别检查约束在触发器被使用前后开始工作。因为当数据被引进给表格的时候,检查约束就会确认数据,它不能确认一个删除的操作。在触发器之后,它就可以确定删除操作。
一个栏或者表格级别检查约束使用最小的代码来加速仅仅允许一个特别应用程序更新表格的需求。
下面的例子将会创建一个叫做CheckAppName名字的代码。表格级别检查约束将被添加到检查一个应用程序VBApp中。当在检查约束中的时候,一个后来将被删除的触发器将被创建用来检查相同的应用程序VBApp。
USE Northwind
GO
SET NOCOUNT ON
GO
CREATE TABLE CheckAppName
(CheckAppNameId INT NOT NULL
CONSTRAINT PkCheckAppName PRIMARY KEY CLUSTERED,
DescrText char (20) NOT NULL,
CONSTRAINT tck_AppName CHECK (APP_NAME() = 'VBApp'))
GO
--创建触发器的基本模式
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = N'tiud_CheckAppName'
AND type
= 'TR')
DROP TRIGGER tiud_CheckAppName
GO
CREATE TRIGGER tiud_CheckAppName
ON Northwind.dbo.CheckAppName
FOR DELETE
AS
BEGIN
IF (SELECT APP_NAME()) != 'VBApp'
BEGIN
RAISERROR ('CAN NOT USE THIS APPLICATION TO UPDATE
TABLE ', 16, 10)
ROLLBACK
END
END
GO
下面的例子代码试图插入值并从使用SQL 查询分析器中删除行。SQL 查询分析器同样是应用程序的名字,这个名字函数APP_NAME ()会检索它。
INSERT Northwind.dbo.CheckAppName VALUES (1, 'TEST')
GO
SELECT * FROM Northwind.dbo.CheckAppName
GO
DELETE Northwind.dbo.CheckAppName
GO
SELECT * FROM Northwind.dbo.CheckAppName
GO
因为检查约束,插入和删除会失败。删除应该失败这是因为触发器产生了错误的消息。
下面的代码将试图更新表格。检查约束错误将不会发布命令因为更新语句没有数据执行。当在触发器和检查约束的时候,代码会失效。
一旦触发器和检查约束失效,一个行将插入到表格中。然后触发器和检查约束重新开始有效。
UPDATE Northwind.dbo.CheckAppName SET DescrText = 'Test
3.1'
GO
SELECT * FROM Northwind.dbo.CheckAppName
GO
ALTER TABLE Northwind.dbo.CheckAppName DISABLE TRIGGER tiud_CheckAppName
GO
ALTER TABLE Northwind.dbo.CheckAppName NOCHECK CONSTRAINT tck_AppName
GO
INSERT Northwind.dbo.CheckAppName VALUES (1, 'TEST')
GO
SELECT * FROM Northwind.dbo.CheckAppName
GO
ALTER TABLE Northwind.dbo.CheckAppName ENABLE TRIGGER tiud_CheckAppName
GO
ALTER TABLE Northwind.dbo.CheckAppName CHECK CONSTRAINT tck_AppName
GO
UPDATE Northwind.dbo.CheckAppName SET DescrText = 'Test 3.1'
GO
SELECT * FROM Northwind.dbo.CheckAppName
GO
DROP TABLE Northwind.dbo.CheckAppName
GO
这次,当更新语句被执行的时候,检查约束错误应该就被解决掉了。