Ⅰ sql的触发器是干什么的,怎么用
触发器是用来保证数据一致性用的.他分为两种一种是操作前触发另外一种是操作后触发 ,主要是对数据的插入,删除,修改等动作进行跟踪及作出相应动作
Ⅱ SQL数据库问题,现在想做一个触发器:
SQLServer触发器创建、删除、修改、查看...
??本站整理??互联网??2010-06-26 ??点击:?17380???我要评论
一:触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。?
二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表。?
一:触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。?
二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。?
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。?
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。?
三:Instead of和After触发器?
SQL Server2000提供了两种触发器:Instead of和After触发器。这两种触发器的差别在于他们被激活的同:?
Ins...
Ⅲ 关于SQL的触发器基本语法。急
触发器应该在表orders上
create trigger tr_del
on orders ------错误1
after delete
as
begin
DECLARE @orderid CHAR(10);
SELECT @orderid=orderid FROM deleted; ---错误二
delete from orderdetails where orderid=@orderid ; ---错误三
end
Ⅳ SQL Server数据库触发器问题
CREATE TRIGGER trigger1 ON zw_bkd
WITH EXECUTE AS CALLER
AFTER UPDATE
AS
BEGIN
declare @oldshr int,@newshr int, @gsdm int,@kjnd int,@je int,@zbid int
--这里视你的情况修改变量类型
if update(shr)
begin
select @oldshr=Deleted.shr from Deleted --@oldshr是更新前的shr
select @newshr=Inserted.shr, --@newshr是更新后的shr
@gsdm=Inserted.gsdm,@kjnd=Inserted.kjnd,
@je=Inserted.je,@zbid=Inserted.zbid
from Inserted
if @oldshr is null and @newshr is not null --如果shr从空变为非空
begin
--如果zw_ed 中存在zbid与zw_bkd相同的行,删除这些行
if (select count(*) from zw_ed where zw_ed.zbid=@zbid)!=0
delete from zw_ed where zw_ed.zbid=@zbid
--将zw_bkd里的gsdm,kjnd,je,zbid插入到zw_ed表里
insert into zw_ed (gsdm,kjnd,je,zbid) values (@gsdm,@kjnd,@je,@zbid)
end
else if @oldshr is not null and @newshr is null --如果shr从非空变为空
begin
--删除zw_ed 中zbid与zw_bkd相同的行
delete from zw_ed where zw_ed.zbid=@zbid
end
end
END
Ⅳ sql 触发器问题,提示错误207:列名“是”无效
CREATE TRIGGER Goods ON dbo.Goods
FOR INSERT
AS IF( (SELECT INSERTED.IsLi FROM INSERTED) ='是')
Insert into tb_Li (GoodsID) Select Inserted.GoodsID From Inserted
记得字符型要加单引号.
Ⅵ sql触发器
先看看第一个 最折腾的,是不是这样:
CREATE TABLE dormitory (
fh VARCHAR(10) PRIMARY KEY, -- 1个是宿舍表(dormitory),主键是房间号(fh)
lh VARCHAR(10),
xb VARCHAR(2) -- dormintory表的楼号(lh),房间号(fh),性别(xb)字段可以显示,两个表的外键是楼号(lh).
)
CREATE TABLE room (
lh VARCHAR(10) PRIMARY KEY, -- 一个是房间表(room),主键是楼号(lh)
fh VARCHAR(10), -- 房号
xb VARCHAR(2), -- 当room表中的性别(xb)字段为‘男’的时候
yzrs INT, -- 希望room表里面的宿舍房间的已住人数(yzrs)+可住人数(kzrs)=在的人数(zdrs).
kzrs INT,
zdrs INT
)
CREATE TABLE student (
id INT,
fh VARCHAR(10) -- 希望student表的字段房间号(fh)插入数据时,room表的已住人数(yzrs)减1,可住人数(kzrs)加1
)
INSERT INTO dormitory VALUES('C#608', 'C#', '');
INSERT INTO dormitory VALUES('A#256', 'A#', '');
INSERT INTO room VALUES('C#', '608', '', 4, 4, 8);
INSERT INTO room VALUES('A#', '256', '', 4, 4, 8);
INSERT INTO student VALUES(1, '');
CREATE TRIGGER AfterUpdateRoom
ON room
FOR UPDATE
AS
DECLARE
@OldXb VARCHAR(2),
@NewXb VARCHAR(2),
@NewLh VARCHAR(10),
@NewFh VARCHAR(10);
BEGIN
-- deleted 为 更新前的数据.
SELECT @OldXb = xb FROM deleted;
-- inserted 为 更新后的数据.
SELECT
@NewXb = xb ,
@NewLh = lh ,
@NewFh = fh FROM inserted;
-- 如果这次更新,更新到了 性别,
-- 而且 性别 为 男,那么做处理
IF @OldXb != @NewXb AND @NewXb = '男'
BEGIN
-- dormintory表的楼号(lh),房间号(fh),性别(xb)字段可以显示,
-- 两个表的外键是楼号(lh).
UPDATE
dormintory
SET
xb = @NewXb
WHERE
lh = @NewLh + @NewFh;
END;
END
Ⅶ SQL中触发器主要用于实施什么类型的数据完整性如何实施
[编辑本段]SQL触发器
触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。 CREATE PROCEDURE 或 CREATE TRIGGER 语句不能跨越批处理。即存储过程或触发器始终只能在一个批处理中创建并编译到一个执行计划中。 用触发器还可以强制执行业务规则 Microsoft® SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。
[编辑本段]优点
触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。 触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。 与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。 一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。 比较触发器与约束 约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。 实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制。 在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。例如: 除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。 CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。 约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。 触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。 触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。 如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。
[编辑本段]SQL触发器语法
语法 CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) updated_bitmask ) column_bitmask [ ...n ] } ] sql_statement [ ...n ] } } 参数 trigger_name 是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。 Table | view 是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。 WITH ENCRYPTION 加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。 AFTER 指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。 如果仅指定 FOR 关键字,则 AFTER 是默认设置。 不能在视图上定义 AFTER 触发器。 INSTEAD OF 指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。 在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。 INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。 { [DELETE] [,] [INSERT] [,] [UPDATE] } 是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。 对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。 WITH APPEND 指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时,才需要使用该可选子句。如果兼容级别是 70 或更高,则不必使用 WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为)。有关更多信息,请参见 sp_dbcmptlevel。 WITH APPEND 不能与 INSTEAD OF 触发器一起使用,或者,如果显式声明 AFTER 触发器,也不能使用该子句。只有当出于向后兼容而指定 FOR 时(没有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以后的版本将不支持 WITH APPEND 和 FOR(将被解释为 AFTER)。 NOT FOR REPLICATION 表示当复制进程更改触发器所涉及的表时,不应执行该触发器。 AS 是触发器要执行的操作。 sql_statement 是触发器的条件和操作。触发器条件指定其它准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。 当尝试 DELETE、INSERT 或 UPDATE 操作时,Transact-SQL语句中指定的触发器操作将生效。 触发器可以包含任意数量和种类的 Transact-SQL 语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的 Transact-SQL 语句常常包含控制流语言。CREATE TRIGGER 语句中使用几个特殊的表: * deleted 和 inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,请使用: SELECT * FROM deleted * 如果兼容级别等于 70,那么在 DELETE、INSERT 或 UPDATE 触发器中,SQL Server 将不允许引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能访问 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 触发器中检索新值,请将 inserted 表与原始更新表联接。当兼容级别是 65 或更低时,对 inserted 或 deleted 表中允许空值的text、ntext 或 image 列,将返回空值;如果这些列不可为空,则返回零长度字符串。 当兼容级别是 80 或更高时,SQL Server 允许在表或视图上通过 INSTEAD OF 触发器更新 text、ntext 或 image 列。 n 是表示触发器中可以包含多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句,可以通过重复 UPDATE (column) 子句包含多列。 IF UPDATE (column) 测试在指定的列上进行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE 操作,请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。 说明 IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 语句,并且可以使用 BEGIN...END 语句块。有关更多信息,请参见控制流语言。 可以在触发器主体中的任意位置使用 UPDATE (column)。 column 是要测试 INSERT 或 UPDATE 操作的列名。该列可以是 SQL Server 支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。 IF (COLUMNS_UPDATED()) 测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。 COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。 可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。 bitwise_operator 是用于比较运算的位运算符。 updated_bitmask 是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2、C3 和 C4 是否都有更新,指定值 14;若要检查是否只有列 C2 有更新,指定值 2。 comparison_operator 是比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 检查 updated_bitmask 中指定的任一列或某些列是否已更新。 column_bitmask 是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。 注释 触发器常常用于强制业务规则和数据完整性。SQL Server 通过表创建语句(ALTER TABLE 和 CREATE TABLE)提供声明引用完整性 (DRI);但是 DRI 不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 关键字)。如果触发器表存在约束,则在 INSTEAD OF 触发器执行之后和 AFTER 触发器执行之前检查这些约束。如果违反了约束,则回滚 INSTEAD OF 触发器操作且不执行(激发)AFTER 触发器。 可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER 触发器。在表上只能为每个 INSERT、UPDATE 和 DELETE 操作指定一个第一个执行和一个最后一个执行的 AFTER 触发器。如果同一表上还有其它 AFTER 触发器,则这些触发器将以随机顺序执行。 如果 ALTER TRIGGER 语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用 sp_settriggerorder 重置排序值。 只有当触发 SQL 语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER 触发器才会执行。AFTER 触发器检查触发语句的运行效果,以及所有由触发语句引起的 UPDATE 和 DELETE 引用级联操作的效果。 触发器限制 CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用到一个表中。 触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。 如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。 在同一条 CREATE TRIGGER 语句中,可以为多种用户操作(如 INSERT 和 UPDATE)定义相同的触发器操作。 如果一个表的外键在 DELETE/UPDATE 操作上定义了级联,则不能在该表上定义 INSTEAD OF DELETE/UPDATE 触发器。 在触发器内可以指定任意的 SET 语句。所选择的 SET 选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。
Ⅷ 急, sql 触发器哪里错了
是触发器delete_site不存在,你这个语句是修改触发器,修改触发器当然必须得是存在的才行。
你这个需要create创建
CREATE TRIGGER [delete_site] on [WebSites] for DELETE
as
declare @webid int
select @webid=webid from deleted
begin
delete [ViewOnClick] where webid=@webid
end
创建以后如果需要修改,再用ALTER就没问题了
Ⅸ SQL触发器 求救
就是上面这个老兄说的啦~~~~
只要你把你自己的触发器的名称和你要删除的表的字段和deleted表的相应字段对应就可以了~~~
CREATE TRIGGER [TRIGGER NAME] ON [dbo].[sysfiles]
FOR DELETE
AS
delete from table_name where table_name.[字段]=deleted.[字段]