当前位置:首页 » 编程语言 » sql执行触发器语句

sql执行触发器语句

发布时间: 2023-02-07 06:07:20

⑴ 求sql语句,触发器的一些操作

(1)
alter atble S
drop constraints 完整性约束名
go
create trigger pksno on s for insert
as
declare @sno varchar(10)
select @sno=sno from inserted
if @sno is null
begin
print 'SNO不能为空'
rollback
end
if @sno in (select sno from s)
begin
print 'sno不可重复'
rollback
end
(2)
create trigger uc on c for update
as
declare @credit int
select @credit=credit from inserted
if @credit>6
begin
print '该项数据不能大于6'
rollback
end
这个是在SQL2000上实现的

⑵ SQL中,触发器是什么

1. 基本概念x0dx0a触发器是特殊的存储过程,基于一个表创建,主要作用就是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。x0dx0a当触发器所保护的数据发生变化(update,insert,delete)后,自动运行以保证数据的完整性和正确性。通俗的说:通过一个动作(update,insert,delete)调用一个存储过程(触发器)。x0dx0a2. 类型x0dx0a(1)DML触发器x0dx0a在数据库中发生数据操作语言(DML)事件时将启用。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 T-SQL 语句。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。x0dx0a(2)DDL 触发器x0dx0aSQL Server 2005 的新增功能。当服务器或数据库中发生数据定义语言(DDL)事件时将调用这些触发器。但与DML触发器不同的是,它们不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发,相反,它们会为响应多种数据定义语言(DDL)语句而激发。这些语句主要是以CREATE、ALTER和DROP开头的语句。DDL触发器可用于管理任务,例如审核和控制数据库操作。x0dx0a 创建DML触发器x0dx0a1. 使用存储过程模板创建存储过程x0dx0a在【对象资源管理器】窗口中,展开“数据库”节点,再展开所选择的具体数据库节点,再展开“表”节点,右击要创建触发器的“表”,选择“新建触发器”命令,如图所示:x0dx0a在右侧查询编辑器中出现触发器设计模板,用户可以在此基础上编辑触发器,单击“执行”按钮,即可创建该触发器。x0dx0ax0dx0a2. 使用T-SQL语句创建表x0dx0aCREATE TRIGGER 触发器x0dx0aON 表名x0dx0aFOR[update,insert,delete ]x0dx0aAS SQL语句x0dx0a例9-6:创建基于表reader ,DELETE操作的触发器。x0dx0aUSE Libraryx0dx0aGOx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0a WHERE name='reader_d' AND type='TR')x0dx0aDROP TRIGGER reader_d --如果已经存在触发器reader_d则删除x0dx0aGOx0dx0aCREATE TRIGGER reader_d --创建触发器x0dx0aON reader --基于表 x0dx0aFOR DELETE --删除事件x0dx0aASx0dx0aPRINT '数据被删除!' --执行显示输出x0dx0aGOx0dx0a 试试吧!x0dx0a应用:x0dx0aUSE Libraryx0dx0aGOx0dx0aDELETE readerx0dx0awhere Rname='aaa'x0dx0a执行结果:x0dx0a数据被删除!x0dx0a(所影响的行数为 1 行)x0dx0a例9-7:在表borrow中添加借阅信息记录时,得到该书的应还日期。x0dx0a说明:在表borrow中增加一个应还日期SReturnDate。x0dx0aUSE Libraryx0dx0aIF EXISTS (SELECT name FROM sysobjectsx0dx0aWHERE name ='T_return_date' AND type='TR')x0dx0aDROP TRIGGER T_return_datex0dx0aGOx0dx0aCREATE TRIGGER T_return_date --创建触发器x0dx0aON Borrow --基于表borrowx0dx0aAfter INSERT --插入操作x0dx0aASx0dx0a--查询插入记录INSERTED中读者的类型x0dx0aDECLARE @type int,@dzbh char(10),@tsbh char(15)x0dx0aSET @dzbh=(SELECT RID FROM inserted)x0dx0aSET @tsbh=(SELECT BID FROM inserted)x0dx0aSELECT @type= TypeIDx0dx0aFROM readerx0dx0aWHERE RID=(SELECT RID FROM inserted)--副本x0dx0a/*把Borrow表中的应还日期改为x0dx0a当前日期加上各类读者的借阅期限*/x0dx0aUPDATE Borrow SET SReturnDate=getdate()+x0dx0aCASE x0dx0a WHEN @type=1 THEN 90x0dx0a WHEN @type=2 THEN 60x0dx0a WHEN @type=3 THEN 30x0dx0aENDx0dx0aWHERE RID=@dzbh and BID=@tsbhx0dx0a应用:x0dx0aUSE Libraryx0dx0aINSERT INTO borrow(RID,BID) values(�','TP85-08')x0dx0a查看记录:x0dx0a x0dx0a例9-8:在数据库Library中,当读者还书时,实际上要修改表brorrowinf中相应记录还期列的值,请计算出是否过期。x0dx0aUSE Libraryx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0aWHERE name='T_fine_js' AND type='TR')x0dx0aDROP TRIGGER T_fine_jsx0dx0aGOx0dx0aCREATE TRIGGER T_fine_jsx0dx0aON borrowx0dx0aAfter UPDATEx0dx0aASx0dx0aDECLARE @days int,@dzbh char(10),@tsbh char(15)x0dx0aSET @dzbh=(select RID from inserted)x0dx0aSET @tsbh=(select BID from inserted)x0dx0aSELECT @days=DATEDIFF(day, ReturnDate, SReturnDate)x0dx0a--DATEDIFF函数返回两个日期之差,单位为DAYx0dx0aFROM borrowx0dx0aWHERE RID=@dzbh and BID=@tsbhx0dx0aIF @days>0x0dx0a PRINT '没有过期!'x0dx0aELSEx0dx0a PRINT '过期'+convert(char(6),@days)+'天'x0dx0aGOx0dx0a应用:x0dx0aUSE Libraryx0dx0aUPDATE borrow SET ReturnDate=񟭇-12-12'x0dx0aWHERE RID=�' and BID='TP85-08'x0dx0aGOx0dx0a执行结果:x0dx0a过期-157 天x0dx0a(1 行受影响)x0dx0a例9-9:对Library库中Reader表的 DELETE操作定义触发器。x0dx0aUSE Libraryx0dx0aGOx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0a WHERE name='reader_d' AND type='TR')x0dx0aDROP TRIGGER reader_dx0dx0aGOx0dx0aCREATE TRIGGER reader_dx0dx0aON Readerx0dx0aFOR DELETEx0dx0aASx0dx0aDECLARE @data_yj intx0dx0aSELECT @data_yj=Lendnumx0dx0aFROM deletedx0dx0aIF @data_yj>0x0dx0a BEGINx0dx0a PRINT '该读者不能删除!还有'+convert(char(2),@data_yj)+'本书没还。x0dx0a ROLLBACKx0dx0a ENDx0dx0aELSEx0dx0a PRINT '该读者已被删除!'x0dx0aGOx0dx0a应用:x0dx0aUSE Libraryx0dx0aGOx0dx0aDELETE Reader WHERE RID=�'x0dx0a执行结果:x0dx0a该读者不能删除!还有4 本书没还。x0dx0a 修改触发器x0dx0aALTER TRIGGER 触发器x0dx0a 删除触发器x0dx0aDROP TRIGGER 触发器x0dx0a 查看触发器x0dx0asp_helptext trigger_namex0dx0asp_helptrigger table_name

⑶ SQL触发器语句

呵呵,看到你的这个问题了,回答一下,希望能给你增加印象。

由于SqlServer 没有oracle中的行级触发器的概念,触发器如下:

create trigger [TC2]
on [dbo].[teacher]
for insert,update
as if (select salary from inserted)<3000
update teacher set salary=3000 and tid= (select tid from inserted)

说明:当你插入数据的时候,这条数据是存放在【inserted】表中的,在这个表中把【teacher】表的主键得到(假如是【tid】)然后把这个主键信息加到where 条件上,这样就能起到只更新插入的那一条数据的效果了,否则会出现更新了全表的问题。

---
以上,希望对你有所帮助。

⑷ 求SQL触发器语句

USE [Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[部门信息](
[部门编号] [nchar](3) COLLATE Chinese_PRC_CI_AS NOT NULL,
[部门名称] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[员工人数] [int] NOT NULL,
CONSTRAINT [PK_部门信息] PRIMARY KEY CLUSTERED
(
[部门编号] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

USE [Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[员工信息](
[员工编号] [nchar](4) COLLATE Chinese_PRC_CI_AS NOT NULL,
[员工姓名] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[性别] [nchar](2) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_员工信息_性别] DEFAULT (N'男'),
[出生年月] [datetime] NULL,
[入职时间] [datetime] NULL,
[部门编号] [nchar](3) COLLATE Chinese_PRC_CI_AS NOT NULL,
CONSTRAINT [PK_员工信息] PRIMARY KEY CLUSTERED
(
[员工编号] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
USE [Test]
GO
ALTER TABLE [dbo].[员工信息] WITH CHECK ADD CONSTRAINT [FK_员工信息_部门信息] FOREIGN KEY([部门编号])
REFERENCES [dbo].[部门信息] ([部门编号]

USE [Test]
ALTER TABLE [员工信息]
ADD CONSTRAINT CK_Employee_Sex CHECK (性别='男' or 性别='女' );

消息213,级别16,状态1,第3 行
插入错误: 列名或所提供值的数目与表定义不匹配

use Test
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER TRIGGER [uEmployee]
ON [dbo].[员工信息] AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE [员工信息]
SET 入职时间=getdate()
end

use Test
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER TRIGGER [uEmployee]
ON [dbo].[员工信息] AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE [员工信息]
SET 入职时间=getdate()
end

⑸ sql 执行触发器 执行语句不成功

你这个是FOR触发器,在语句后面执行,inserted和ssss表中的数据已经是一样的了,你下面两句得到的结果都是修改后的值:


select@sname=name,@ssr=srfrominserted

select@ssr2=srfromsssswherename=@sname


改成:

createtriggercf_lzonssss
forinsert,update
as
declare@snamenvarchar(10),@ssrnvarchar(10),@ssr2nvarchar(10)
select@sname=name,@ssr=srfromdeleted
select@ssr2=srfromsssswherename=@sname
printlen(@ssr)
print@ssr
if(len(@ssr2)>0andlen(@ssr)>0)
begin
print1
rollbacktran--rollbacktran
end

⑹ sql脚本执行触发器语句出错 sould end with "/"

你应该是在.sh
脚本文件中使用
sql
语句吧
在脚本文件中执行命令行sql语句,换行时应该在每行语句后面使用
,语句结束使用分号。
给个例子:
select
*
from
table_name

where
id='xxx'

⑺ SQL 触发器语句

create trigger checkRoysched
on roysched
INSTEAD OF INSERT --改成这个,这是在Insert之前的触发。
as
if ((select title_id from roysched) is null) or
((select royalty from roysched) is null)
begin
print 'royalty,titlt_id字段不能为空'
rollback transaction
end
go

热点内容
万科海上传奇二期 发布:2024-11-01 14:22:52 浏览:59
u盘文件夹是空的 发布:2024-11-01 14:19:57 浏览:402
python包含字符串 发布:2024-11-01 14:19:17 浏览:479
c语言的精华 发布:2024-11-01 14:19:02 浏览:588
steam截图文件夹 发布:2024-11-01 14:18:59 浏览:613
ipad怎么往安卓传照片 发布:2024-11-01 14:18:19 浏览:508
我的电脑没有文件夹选项 发布:2024-11-01 14:13:55 浏览:546
vb创建数据库表 发布:2024-11-01 14:11:55 浏览:872
sql联合表 发布:2024-11-01 14:03:25 浏览:962
linux编程gcc 发布:2024-11-01 14:02:41 浏览:705